@xyo-network/xl1-cli-lib 1.19.14 → 1.19.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,326 +0,0 @@
1
- import type { Logger, Promisable } from '@xylabs/sdk-js'
2
- import {
3
- asAddress, assertEx, isDefined, isString,
4
- } from '@xylabs/sdk-js'
5
- import {
6
- initApiWallet, initBalanceSummaryMap, initEvmProvidersIfAvailable, initFinalizationArchivistIfNeeded, initProducerAccount, initServerNode,
7
- initStatusReporter, initTransferSummaryMap,
8
- } from '@xyo-network/chain-orchestration'
9
- import { SimpleBlockRunner } from '@xyo-network/chain-services'
10
- import { initTelemetry } from '@xyo-network/chain-telemetry'
11
- import { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'
12
- import { HDWallet } from '@xyo-network/wallet'
13
- import type {
14
- Config, CreatableProviderContext, ProviderFactoryLocatorInstance, RpcSchemaMap, TransportFactory,
15
- } from '@xyo-network/xl1-sdk'
16
- import {
17
- AccountBalanceViewerRpcSchemas,
18
- ADDRESS_INDEX,
19
- BlockViewerRpcSchemas,
20
- FinalizationViewerRpcSchemas,
21
- generateXyoBaseWalletFromPhrase,
22
- HttpRpcTransport,
23
- JsonRpcAccountBalanceViewer,
24
- JsonRpcBlockViewer,
25
- JsonRpcFinalizationViewer,
26
- JsonRpcMempoolRunner,
27
- JsonRpcMempoolViewer,
28
- MempoolRunnerRpcSchemas,
29
- MempoolViewerRpcSchemas,
30
- ProviderFactoryLocator,
31
- SimpleAccountBalanceViewer,
32
- SimpleBlockRewardViewer,
33
- SimpleBlockValidationViewer,
34
- SimpleBlockViewer,
35
- SimpleFinalizationRunner,
36
- SimpleFinalizationViewer,
37
- SimpleMempoolRunner,
38
- SimpleMempoolViewer,
39
- SimpleNetworkStakeViewer,
40
- SimpleStepRewardsByPositionViewer,
41
- SimpleStepRewardsByStakerViewer,
42
- SimpleStepRewardsByStepViewer,
43
- SimpleStepRewardsTotalViewer,
44
- SimpleStepRewardsViewer,
45
- SimpleStepViewer,
46
- SimpleTimeSyncViewer,
47
- SimpleWindowedBlockViewer,
48
- SimpleXyoConnectionRunner,
49
- SimpleXyoConnectionViewer,
50
- SimpleXyoGateway,
51
- SimpleXyoGatewayRunner,
52
- SimpleXyoRunner,
53
- SimpleXyoSigner,
54
- SimpleXyoViewer,
55
- } from '@xyo-network/xl1-sdk'
56
-
57
- export async function telemetryContextFromConfig(config: Config, serviceName: string, serviceVersion: string) {
58
- const { otlpEndpoint } = config.telemetry?.otel ?? {}
59
- const { path: endpoint = '/metrics', port: port = 9466 } = config.telemetry?.metrics?.scrape ?? {}
60
- return await initTelemetry({
61
- attributes: {
62
- serviceName,
63
- serviceVersion,
64
- },
65
- otlpEndpoint,
66
- metricsConfig: { endpoint, port },
67
- })
68
- }
69
-
70
- export async function contextFromConfigWithoutLocator(
71
- config: Config,
72
- logger: Logger,
73
- serviceName: string,
74
- serviceVersion: string,
75
- ): Promise<Omit<CreatableProviderContext, 'locator'>> {
76
- const singletons = {}
77
- const caches = {}
78
- const telemetryConfig = await telemetryContextFromConfig(config, serviceName, serviceVersion)
79
- const statusReporter = initStatusReporter({ logger })
80
- return {
81
- ...telemetryConfig,
82
- config,
83
- singletons,
84
- caches,
85
- logger,
86
- statusReporter,
87
- }
88
- }
89
-
90
- export async function rootLocatorFromConfig(
91
- config: Config,
92
- context: Omit<CreatableProviderContext, 'locator'>,
93
- ): Promise<ProviderFactoryLocatorInstance> {
94
- let locator: ProviderFactoryLocatorInstance = new ProviderFactoryLocator(context)
95
-
96
- locator.registerMany([
97
- SimpleNetworkStakeViewer.factory<SimpleNetworkStakeViewer>(SimpleNetworkStakeViewer.dependencies, {}),
98
- SimpleTimeSyncViewer.factory<SimpleTimeSyncViewer>(SimpleTimeSyncViewer.dependencies, {}),
99
- SimpleStepViewer.factory<SimpleStepViewer>(SimpleStepViewer.dependencies, {}),
100
- SimpleStepRewardsViewer.factory<SimpleStepRewardsViewer>(SimpleStepRewardsViewer.dependencies, {}),
101
- SimpleStepRewardsByPositionViewer.factory<SimpleStepRewardsByPositionViewer>(SimpleStepRewardsByPositionViewer.dependencies, {}),
102
- SimpleStepRewardsByStakerViewer.factory<SimpleStepRewardsByStakerViewer>(SimpleStepRewardsByStakerViewer.dependencies, {}),
103
- SimpleStepRewardsByStepViewer.factory<SimpleStepRewardsByStepViewer>(SimpleStepRewardsByStepViewer.dependencies, {}),
104
- SimpleStepRewardsTotalViewer.factory<SimpleStepRewardsTotalViewer>(SimpleStepRewardsTotalViewer.dependencies, {}),
105
- SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(
106
- SimpleBlockValidationViewer.dependencies,
107
- { state: validateHydratedBlockState, protocol: validateHydratedBlock },
108
- ),
109
- ])
110
- locator = await initEvmProvidersIfAvailable(locator)
111
- locator = await (isString(config.remote.rpc?.url)
112
- ? remoteLocatorFromConfig(config, { ...context, locator })
113
- : localLocatorFromConfig(config, { ...context, locator }))
114
- locator.freeze()
115
- return locator
116
- }
117
-
118
- export async function localLocatorFromConfig(
119
- config: Config,
120
- context: CreatableProviderContext,
121
- ): Promise<ProviderFactoryLocatorInstance> {
122
- const balancesSummaryMap = assertEx(await initBalanceSummaryMap(context), () => 'Balance Summary Map not initialized')
123
- const transfersSummaryMap = assertEx(await initTransferSummaryMap(context), () => 'Transfer Summary Map not initialized')
124
-
125
- // TODO: this should not be an api wallet, but a server wallet
126
- const wallet = await initApiWallet(context)
127
-
128
- const {
129
- writableChainArchivist, readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
130
- } = await initServerNode({
131
- ...context,
132
- wallet,
133
- transfersSummaryMap,
134
- balancesSummaryMap,
135
- })
136
-
137
- await initFinalizationArchivistIfNeeded(writableChainArchivist, config, wallet)
138
-
139
- const locator = new ProviderFactoryLocator(context)
140
- locator.registerMany([
141
- SimpleMempoolViewer.factory<SimpleMempoolViewer>(SimpleMempoolViewer.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
142
- SimpleMempoolRunner.factory<SimpleMempoolRunner>(SimpleMempoolRunner.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
143
- SimpleAccountBalanceViewer.factory<SimpleAccountBalanceViewer>(SimpleAccountBalanceViewer.dependencies, { balancesSummaryMap, transfersSummaryMap }),
144
- SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
145
- SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
146
- SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(SimpleWindowedBlockViewer.dependencies, { maxWindowSize: 10_000, syncInterval: 10_000 }),
147
- SimpleXyoConnectionViewer.factory<SimpleXyoConnectionViewer>(SimpleXyoConnectionViewer.dependencies, {}),
148
- SimpleXyoViewer.factory<SimpleXyoViewer>(SimpleXyoViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
149
- SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
150
- SimpleFinalizationRunner.factory<SimpleFinalizationRunner>(SimpleFinalizationRunner.dependencies, { finalizedArchivist: writableChainArchivist }),
151
-
152
- ])
153
- locator.freeze()
154
- return locator
155
- }
156
-
157
- export async function remoteLocatorFromConfig(
158
- config: Config,
159
- context: CreatableProviderContext,
160
- ): Promise<ProviderFactoryLocatorInstance> {
161
- const balancesSummaryMap = assertEx(await initBalanceSummaryMap(context), () => 'Balance Summary Map not initialized')
162
- const transfersSummaryMap = assertEx(await initTransferSummaryMap(context), () => 'Transfer Summary Map not initialized')
163
-
164
- // TODO: this should not be an api wallet, but a server wallet
165
- const wallet = await initApiWallet(context)
166
-
167
- const {
168
- readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
169
- } = await initServerNode({
170
- ...context,
171
- wallet,
172
- transfersSummaryMap,
173
- balancesSummaryMap,
174
- })
175
-
176
- const locator = new ProviderFactoryLocator(context)
177
- locator.registerMany([
178
- SimpleMempoolViewer.factory<SimpleMempoolViewer>(SimpleMempoolViewer.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
179
- SimpleMempoolRunner.factory<SimpleMempoolRunner>(SimpleMempoolRunner.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
180
- SimpleAccountBalanceViewer.factory<SimpleAccountBalanceViewer>(SimpleAccountBalanceViewer.dependencies, { balancesSummaryMap, transfersSummaryMap }),
181
- SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
182
- SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
183
- SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(SimpleWindowedBlockViewer.dependencies, { maxWindowSize: 10_000, syncInterval: 10_000 }),
184
- SimpleXyoViewer.factory<SimpleXyoViewer>(SimpleXyoViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
185
- ])
186
- locator.freeze()
187
- return locator
188
- }
189
-
190
- export async function producerLocatorFromConfig(
191
- config: Config,
192
- context: CreatableProviderContext,
193
- ): Promise<ProviderFactoryLocatorInstance> {
194
- const { logger } = context
195
- const account = await initProducerAccount({ config })
196
- const locator = new ProviderFactoryLocator(context)
197
- const rewardAddress = asAddress(config.actors.producer.rewardAddress ?? account.address, true)
198
- logger?.info(`Using reward address ${rewardAddress}`)
199
- if (rewardAddress === account.address) {
200
- logger?.warn(`Using producer account address as reward address: ${account.address}`)
201
- }
202
-
203
- const remoteUrl = config.actors.producer.remote.rpc?.url
204
-
205
- if (isString(remoteUrl)) {
206
- const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(remoteUrl, schemas)
207
-
208
- locator.registerMany([
209
- JsonRpcMempoolViewer.factory<JsonRpcMempoolViewer>(JsonRpcMempoolViewer.dependencies, { transport: await transportFactory(MempoolViewerRpcSchemas) }),
210
- JsonRpcMempoolRunner.factory<JsonRpcMempoolRunner>(JsonRpcMempoolRunner.dependencies, { transport: await transportFactory(MempoolRunnerRpcSchemas) }),
211
- JsonRpcAccountBalanceViewer.factory<JsonRpcAccountBalanceViewer>(
212
- JsonRpcAccountBalanceViewer.dependencies,
213
- { transport: await transportFactory(AccountBalanceViewerRpcSchemas) },
214
- ),
215
- JsonRpcFinalizationViewer.factory<JsonRpcFinalizationViewer>(
216
- JsonRpcFinalizationViewer.dependencies,
217
- { transport: await transportFactory(FinalizationViewerRpcSchemas) },
218
- ),
219
- JsonRpcBlockViewer.factory<JsonRpcBlockViewer>(JsonRpcBlockViewer.dependencies, { transport: await transportFactory(BlockViewerRpcSchemas) }),
220
- ])
221
- }
222
-
223
- locator.registerMany([
224
- SimpleBlockRewardViewer.factory<SimpleBlockRewardViewer>(SimpleBlockRewardViewer.dependencies, {}),
225
- SimpleBlockRunner.factory<SimpleBlockRunner>(
226
- SimpleBlockRunner.dependencies,
227
- { account, rewardAddress },
228
- )])
229
- locator.freeze()
230
- return locator
231
- }
232
-
233
- export function apiLocatorFromConfig(
234
- config: Config,
235
- context: CreatableProviderContext,
236
- ): Promisable<ProviderFactoryLocatorInstance> {
237
- const locator = new ProviderFactoryLocator(context)
238
-
239
- locator.registerMany([
240
- SimpleXyoRunner.factory<SimpleXyoRunner>(SimpleXyoRunner.dependencies, {}),
241
- SimpleXyoConnectionRunner.factory<SimpleXyoConnectionRunner>(SimpleXyoConnectionRunner.dependencies, {}),
242
- SimpleXyoGateway.factory<SimpleXyoGateway>(SimpleXyoGateway.dependencies, {}),
243
- ])
244
- locator.freeze()
245
- return locator
246
- }
247
-
248
- export function mempoolLocatorFromConfig(
249
- config: Config,
250
- context: CreatableProviderContext,
251
- ): Promisable<ProviderFactoryLocatorInstance> {
252
- const locator = new ProviderFactoryLocator(context)
253
-
254
- locator.registerMany([
255
- ])
256
- locator.freeze()
257
- return locator
258
- }
259
-
260
- export async function bridgeLocatorFromConfig(
261
- config: Config,
262
- context: CreatableProviderContext,
263
- ): Promise<Promise<Promisable<ProviderFactoryLocatorInstance>>> {
264
- const locator = new ProviderFactoryLocator(context)
265
-
266
- const { mnemonic } = config.actors.bridge
267
- const walletPhrase = isDefined(mnemonic) ? mnemonic : HDWallet.generateMnemonic()
268
- const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)
269
- const signerAccount = await wallet.derivePath(ADDRESS_INDEX.XYO)
270
-
271
- const remoteUrl = config.actors.bridge.remote.rpc?.url
272
-
273
- if (isString(remoteUrl)) {
274
- const transportFactory: TransportFactory = (schemas: RpcSchemaMap) => new HttpRpcTransport(remoteUrl, schemas)
275
-
276
- locator.registerMany([
277
- JsonRpcMempoolViewer.factory<JsonRpcMempoolViewer>(JsonRpcMempoolViewer.dependencies, { transport: await transportFactory(MempoolViewerRpcSchemas) }),
278
- JsonRpcMempoolRunner.factory<JsonRpcMempoolRunner>(JsonRpcMempoolRunner.dependencies, { transport: await transportFactory(MempoolRunnerRpcSchemas) }),
279
- JsonRpcAccountBalanceViewer.factory<JsonRpcAccountBalanceViewer>(
280
- JsonRpcAccountBalanceViewer.dependencies,
281
- { transport: await transportFactory(AccountBalanceViewerRpcSchemas) },
282
- ),
283
- JsonRpcFinalizationViewer.factory<JsonRpcFinalizationViewer>(
284
- JsonRpcFinalizationViewer.dependencies,
285
- { transport: await transportFactory(FinalizationViewerRpcSchemas) },
286
- ),
287
- JsonRpcBlockViewer.factory<JsonRpcBlockViewer>(JsonRpcBlockViewer.dependencies, { transport: await transportFactory(BlockViewerRpcSchemas) }),
288
- ])
289
- }
290
-
291
- locator.registerMany([
292
- SimpleXyoSigner.factory<SimpleXyoSigner>(SimpleXyoSigner.dependencies, { account: signerAccount }),
293
- SimpleXyoRunner.factory<SimpleXyoRunner>(SimpleXyoRunner.dependencies, {}),
294
- SimpleXyoConnectionRunner.factory<SimpleXyoConnectionRunner>(SimpleXyoConnectionRunner.dependencies, {}),
295
- SimpleXyoGatewayRunner.factory<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.dependencies, {}),
296
- ])
297
- locator.freeze()
298
- return locator
299
- }
300
-
301
- export function rewardRedemptionLocatorFromConfig(
302
- config: Config,
303
- context: CreatableProviderContext,
304
- ): Promisable<ProviderFactoryLocatorInstance> {
305
- const locator = new ProviderFactoryLocator(context)
306
-
307
- locator.registerMany([
308
- SimpleXyoGatewayRunner.factory<SimpleXyoGatewayRunner>(SimpleXyoGatewayRunner.dependencies, {}),
309
- ])
310
- locator.freeze()
311
- return locator
312
- }
313
-
314
- export async function locatorsFromConfig(
315
- actors: string[],
316
- config: Config,
317
- context: Omit<CreatableProviderContext, 'locator'>,
318
- ): Promise<Record<string, ProviderFactoryLocatorInstance>> {
319
- const result: Record<string, ProviderFactoryLocatorInstance> = { _root: await rootLocatorFromConfig(config, context) }
320
- if (actors.includes('producer')) result.producer = await producerLocatorFromConfig(config, result._root.context)
321
- if (actors.includes('api')) result.api = await apiLocatorFromConfig(config, result._root.context)
322
- if (actors.includes('mempool')) result.mempool = await mempoolLocatorFromConfig(config, result._root.context)
323
- if (actors.includes('bridge')) result.bridge = await bridgeLocatorFromConfig(config, result._root.context)
324
- if (actors.includes('rewardRedemption')) result.rewardRedemption = await rewardRedemptionLocatorFromConfig(config, result._root.context)
325
- return result
326
- }