@xyo-network/chain-orchestration 1.19.13 → 1.19.15

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 (165) hide show
  1. package/dist/neutral/ChainInitializableParams.d.ts +1 -0
  2. package/dist/neutral/ChainInitializableParams.d.ts.map +1 -1
  3. package/dist/neutral/actor/ValidatorActor.d.ts +2 -2
  4. package/dist/neutral/actor/ValidatorActor.d.ts.map +1 -1
  5. package/dist/neutral/archivists/ChainFinalized/archivist.d.ts.map +1 -1
  6. package/dist/neutral/archivists/ChainFinalized/local.d.ts +2 -2
  7. package/dist/neutral/archivists/ChainFinalized/local.d.ts.map +1 -1
  8. package/dist/neutral/archivists/PendingBlocks/archivist.d.ts +2 -2
  9. package/dist/neutral/archivists/PendingBlocks/archivist.d.ts.map +1 -1
  10. package/dist/neutral/archivists/PendingBlocks/local.d.ts +2 -4
  11. package/dist/neutral/archivists/PendingBlocks/local.d.ts.map +1 -1
  12. package/dist/neutral/archivists/RejectedTransactions/archivist.d.ts +2 -2
  13. package/dist/neutral/archivists/RejectedTransactions/archivist.d.ts.map +1 -1
  14. package/dist/neutral/archivists/RejectedTransactions/local.d.ts +1 -2
  15. package/dist/neutral/archivists/RejectedTransactions/local.d.ts.map +1 -1
  16. package/dist/neutral/archivists/StakeIntentState/archivist.d.ts +2 -3
  17. package/dist/neutral/archivists/StakeIntentState/archivist.d.ts.map +1 -1
  18. package/dist/neutral/archivists/StakeIntentState/local.d.ts +2 -3
  19. package/dist/neutral/archivists/StakeIntentState/local.d.ts.map +1 -1
  20. package/dist/neutral/config/actors/Api.d.ts +890 -0
  21. package/dist/neutral/config/actors/Api.d.ts.map +1 -0
  22. package/dist/neutral/config/actors/Bridge.d.ts +1213 -0
  23. package/dist/neutral/config/actors/Bridge.d.ts.map +1 -0
  24. package/dist/neutral/config/actors/Mempool.d.ts +890 -0
  25. package/dist/neutral/config/actors/Mempool.d.ts.map +1 -0
  26. package/dist/neutral/config/actors/Producer.d.ts +962 -0
  27. package/dist/neutral/config/actors/Producer.d.ts.map +1 -0
  28. package/dist/neutral/config/actors/RewardRedemption.d.ts +878 -0
  29. package/dist/neutral/config/actors/RewardRedemption.d.ts.map +1 -0
  30. package/dist/neutral/config/actors/index.d.ts +7 -0
  31. package/dist/neutral/config/actors/index.d.ts.map +1 -0
  32. package/dist/neutral/config/index.d.ts +5 -0
  33. package/dist/neutral/config/index.d.ts.map +1 -0
  34. package/dist/neutral/config/locators/actors/apiLocatorFromConfig.d.ts +5 -0
  35. package/dist/neutral/config/locators/actors/apiLocatorFromConfig.d.ts.map +1 -0
  36. package/dist/neutral/config/locators/actors/bridgeLocatorFromConfig.d.ts +5 -0
  37. package/dist/neutral/config/locators/actors/bridgeLocatorFromConfig.d.ts.map +1 -0
  38. package/dist/neutral/config/locators/actors/index.d.ts +7 -0
  39. package/dist/neutral/config/locators/actors/index.d.ts.map +1 -0
  40. package/dist/neutral/config/locators/actors/mempoolLocatorFromConfig.d.ts +5 -0
  41. package/dist/neutral/config/locators/actors/mempoolLocatorFromConfig.d.ts.map +1 -0
  42. package/dist/neutral/config/locators/actors/producerLocatorFromConfig.d.ts +4 -0
  43. package/dist/neutral/config/locators/actors/producerLocatorFromConfig.d.ts.map +1 -0
  44. package/dist/neutral/config/locators/actors/rewardRedemptionLocatorFromConfig.d.ts +5 -0
  45. package/dist/neutral/config/locators/actors/rewardRedemptionLocatorFromConfig.d.ts.map +1 -0
  46. package/dist/neutral/config/locators/actors/validatorLocatorFromConfig.d.ts +4 -0
  47. package/dist/neutral/config/locators/actors/validatorLocatorFromConfig.d.ts.map +1 -0
  48. package/dist/neutral/config/locators/contextFromConfigWithoutLocator.d.ts +4 -0
  49. package/dist/neutral/config/locators/contextFromConfigWithoutLocator.d.ts.map +1 -0
  50. package/dist/neutral/config/locators/index.d.ts +8 -0
  51. package/dist/neutral/config/locators/index.d.ts.map +1 -0
  52. package/dist/neutral/config/locators/localLocatorFromConfig.d.ts +3 -0
  53. package/dist/neutral/config/locators/localLocatorFromConfig.d.ts.map +1 -0
  54. package/dist/neutral/config/locators/locatorsFromConfig.d.ts +3 -0
  55. package/dist/neutral/config/locators/locatorsFromConfig.d.ts.map +1 -0
  56. package/dist/neutral/config/locators/remoteLocatorFromConfig.d.ts +3 -0
  57. package/dist/neutral/config/locators/remoteLocatorFromConfig.d.ts.map +1 -0
  58. package/dist/neutral/config/locators/rootLocatorFromConfig.d.ts +3 -0
  59. package/dist/neutral/config/locators/rootLocatorFromConfig.d.ts.map +1 -0
  60. package/dist/neutral/config/locators/telemetryContextFromConfig.d.ts +3 -0
  61. package/dist/neutral/config/locators/telemetryContextFromConfig.d.ts.map +1 -0
  62. package/dist/neutral/config/mergeConfig.d.ts +67 -0
  63. package/dist/neutral/config/mergeConfig.d.ts.map +1 -0
  64. package/dist/neutral/config/tryParseConfig.d.ts +133 -0
  65. package/dist/neutral/config/tryParseConfig.d.ts.map +1 -0
  66. package/dist/neutral/evm/initChainId.d.ts +3 -3
  67. package/dist/neutral/evm/initChainId.d.ts.map +1 -1
  68. package/dist/neutral/evm/initEvmProvider.d.ts +3 -9
  69. package/dist/neutral/evm/initEvmProvider.d.ts.map +1 -1
  70. package/dist/neutral/evm/initInfuraProvider.d.ts +4 -4
  71. package/dist/neutral/evm/initInfuraProvider.d.ts.map +1 -1
  72. package/dist/neutral/evm/initJsonRpcProvider.d.ts +4 -4
  73. package/dist/neutral/evm/initJsonRpcProvider.d.ts.map +1 -1
  74. package/dist/neutral/health/initHealthEndpoints.d.ts +4 -8
  75. package/dist/neutral/health/initHealthEndpoints.d.ts.map +1 -1
  76. package/dist/neutral/index.d.ts +1 -0
  77. package/dist/neutral/index.d.ts.map +1 -1
  78. package/dist/neutral/index.mjs +1019 -343
  79. package/dist/neutral/index.mjs.map +1 -1
  80. package/dist/neutral/init/index.d.ts +2 -2
  81. package/dist/neutral/init/index.d.ts.map +1 -1
  82. package/dist/neutral/init/initActorAccount.d.ts +4 -0
  83. package/dist/neutral/init/initActorAccount.d.ts.map +1 -0
  84. package/dist/neutral/init/initActorSeedPhrase.d.ts +4 -0
  85. package/dist/neutral/init/initActorSeedPhrase.d.ts.map +1 -0
  86. package/dist/neutral/init/initBalanceSummaryMap.d.ts +2 -3
  87. package/dist/neutral/init/initBalanceSummaryMap.d.ts.map +1 -1
  88. package/dist/neutral/init/initBridgedModule.d.ts +4 -7
  89. package/dist/neutral/init/initBridgedModule.d.ts.map +1 -1
  90. package/dist/neutral/init/initEvmProvidersIfAvailable.d.ts.map +1 -1
  91. package/dist/neutral/init/initFinalizationArchivistIfNeeded.d.ts +2 -2
  92. package/dist/neutral/init/initFinalizationArchivistIfNeeded.d.ts.map +1 -1
  93. package/dist/neutral/init/initServerNode.d.ts +2 -9
  94. package/dist/neutral/init/initServerNode.d.ts.map +1 -1
  95. package/dist/neutral/init/initTransferSummaryMap.d.ts +2 -3
  96. package/dist/neutral/init/initTransferSummaryMap.d.ts.map +1 -1
  97. package/dist/neutral/init/initWallet.d.ts +2 -7
  98. package/dist/neutral/init/initWallet.d.ts.map +1 -1
  99. package/dist/neutral/manifest/getLocator.d.ts +2 -7
  100. package/dist/neutral/manifest/getLocator.d.ts.map +1 -1
  101. package/dist/neutral/manifest/loadNode.d.ts +2 -8
  102. package/dist/neutral/manifest/loadNode.d.ts.map +1 -1
  103. package/dist/neutral/orchestrator/Orchestrator.d.ts +4 -4
  104. package/dist/neutral/orchestrator/Orchestrator.d.ts.map +1 -1
  105. package/package.json +51 -31
  106. package/src/ChainInitializableParams.ts +1 -0
  107. package/src/actor/ValidatorActor.ts +3 -2
  108. package/src/archivists/ChainFinalized/archivist.ts +1 -1
  109. package/src/archivists/ChainFinalized/local.ts +2 -2
  110. package/src/archivists/PendingBlocks/archivist.ts +3 -3
  111. package/src/archivists/PendingBlocks/local.ts +2 -2
  112. package/src/archivists/RejectedTransactions/archivist.ts +5 -5
  113. package/src/archivists/RejectedTransactions/local.ts +1 -2
  114. package/src/archivists/StakeIntentState/archivist.ts +12 -15
  115. package/src/archivists/StakeIntentState/local.ts +2 -4
  116. package/src/config/actors/Api.ts +29 -0
  117. package/src/config/actors/Bridge.ts +133 -0
  118. package/src/config/actors/Mempool.ts +39 -0
  119. package/src/config/actors/Producer.ts +56 -0
  120. package/src/config/actors/RewardRedemption.ts +21 -0
  121. package/src/config/actors/index.ts +6 -0
  122. package/src/config/index.ts +4 -0
  123. package/src/config/locators/actors/apiLocatorFromConfig.ts +25 -0
  124. package/src/config/locators/actors/bridgeLocatorFromConfig.ts +71 -0
  125. package/src/config/locators/actors/index.ts +6 -0
  126. package/src/config/locators/actors/mempoolLocatorFromConfig.ts +21 -0
  127. package/src/config/locators/actors/producerLocatorFromConfig.ts +66 -0
  128. package/src/config/locators/actors/rewardRedemptionLocatorFromConfig.ts +21 -0
  129. package/src/config/locators/actors/validatorLocatorFromConfig.ts +15 -0
  130. package/src/config/locators/contextFromConfigWithoutLocator.ts +25 -0
  131. package/src/config/locators/index.ts +7 -0
  132. package/src/config/locators/localLocatorFromConfig.ts +56 -0
  133. package/src/config/locators/locatorsFromConfig.ts +67 -0
  134. package/src/config/locators/remoteLocatorFromConfig.ts +48 -0
  135. package/src/config/locators/rootLocatorFromConfig.ts +47 -0
  136. package/src/config/locators/telemetryContextFromConfig.ts +15 -0
  137. package/src/config/mergeConfig.ts +11 -0
  138. package/src/config/tryParseConfig.ts +36 -0
  139. package/src/evm/initChainId.ts +3 -3
  140. package/src/evm/initEvmProvider.ts +8 -9
  141. package/src/evm/initInfuraProvider.ts +9 -7
  142. package/src/evm/initJsonRpcProvider.ts +9 -7
  143. package/src/health/initHealthEndpoints.ts +15 -18
  144. package/src/index.ts +1 -0
  145. package/src/init/index.ts +2 -2
  146. package/src/init/initActorAccount.ts +28 -0
  147. package/src/init/{initSeedPhrase.ts → initActorSeedPhrase.ts} +10 -10
  148. package/src/init/initBalanceSummaryMap.ts +4 -4
  149. package/src/init/initBridgedModule.ts +6 -8
  150. package/src/init/initEvmProvidersIfAvailable.ts +6 -5
  151. package/src/init/initFinalizationArchivistIfNeeded.ts +8 -5
  152. package/src/init/initServerNode.ts +7 -16
  153. package/src/init/initTransferSummaryMap.ts +4 -4
  154. package/src/init/initWallet.ts +33 -35
  155. package/src/manifest/getLocator.ts +4 -10
  156. package/src/manifest/loadNode.ts +6 -15
  157. package/src/orchestrator/Orchestrator.ts +4 -6
  158. package/dist/neutral/ConfigContext.d.ts +0 -8
  159. package/dist/neutral/ConfigContext.d.ts.map +0 -1
  160. package/dist/neutral/init/initProducerAccount.d.ts +0 -6
  161. package/dist/neutral/init/initProducerAccount.d.ts.map +0 -1
  162. package/dist/neutral/init/initSeedPhrase.d.ts +0 -6
  163. package/dist/neutral/init/initSeedPhrase.d.ts.map +0 -1
  164. package/src/ConfigContext.ts +0 -9
  165. package/src/init/initProducerAccount.ts +0 -30
@@ -0,0 +1,48 @@
1
+ import { assertEx } from '@xylabs/sdk-js'
2
+ import type { ActorConfigContext, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'
3
+ import {
4
+ ProviderFactoryLocator,
5
+ SimpleAccountBalanceViewer,
6
+ SimpleBlockViewer,
7
+ SimpleFinalizationViewer,
8
+ SimpleMempoolRunner,
9
+ SimpleMempoolViewer,
10
+ SimpleWindowedBlockViewer,
11
+ SimpleXyoViewer,
12
+ } from '@xyo-network/xl1-sdk'
13
+
14
+ import {
15
+ initActorWallet, initBalanceSummaryMap,
16
+ initServerNode, initTransferSummaryMap,
17
+ } from '../../init/index.ts'
18
+
19
+ export async function remoteLocatorFromConfig(
20
+ context: ActorConfigContext,
21
+ parent?: ProviderFactoryLocatorInstance,
22
+ ): Promise<ProviderFactoryLocatorInstance> {
23
+ const balancesSummaryMap = assertEx(await initBalanceSummaryMap(context), () => 'Balance Summary Map not initialized')
24
+ const transfersSummaryMap = assertEx(await initTransferSummaryMap(context), () => 'Transfer Summary Map not initialized')
25
+
26
+ // TODO: this should not be an api wallet, but a server wallet
27
+ const wallet = await initActorWallet(context)
28
+
29
+ const {
30
+ readonlyChainArchivist, pendingTransactionsArchivist, pendingBlocksArchivist,
31
+ } = await initServerNode(
32
+ context,
33
+ wallet,
34
+ )
35
+
36
+ const locator = new ProviderFactoryLocator({ ...context, locator: parent })
37
+ locator.registerMany([
38
+ SimpleMempoolViewer.factory<SimpleMempoolViewer>(SimpleMempoolViewer.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
39
+ SimpleMempoolRunner.factory<SimpleMempoolRunner>(SimpleMempoolRunner.dependencies, { pendingTransactionsArchivist, pendingBlocksArchivist }),
40
+ SimpleAccountBalanceViewer.factory<SimpleAccountBalanceViewer>(SimpleAccountBalanceViewer.dependencies, { balancesSummaryMap, transfersSummaryMap }),
41
+ SimpleFinalizationViewer.factory<SimpleFinalizationViewer>(SimpleFinalizationViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
42
+ SimpleBlockViewer.factory<SimpleBlockViewer>(SimpleBlockViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
43
+ SimpleWindowedBlockViewer.factory<SimpleWindowedBlockViewer>(SimpleWindowedBlockViewer.dependencies, { maxWindowSize: 10_000, syncInterval: 10_000 }),
44
+ SimpleXyoViewer.factory<SimpleXyoViewer>(SimpleXyoViewer.dependencies, { finalizedArchivist: readonlyChainArchivist }),
45
+ ])
46
+ locator.freeze()
47
+ return locator
48
+ }
@@ -0,0 +1,47 @@
1
+ import { isString } from '@xylabs/sdk-js'
2
+ import { validateHydratedBlock, validateHydratedBlockState } from '@xyo-network/chain-validation'
3
+ import type { ActorConfigContext, ProviderFactoryLocatorInstance } from '@xyo-network/xl1-sdk'
4
+ import {
5
+ ProviderFactoryLocator,
6
+ SimpleBlockValidationViewer,
7
+ SimpleNetworkStakeViewer,
8
+ SimpleStepRewardsByPositionViewer,
9
+ SimpleStepRewardsByStakerViewer,
10
+ SimpleStepRewardsByStepViewer,
11
+ SimpleStepRewardsTotalViewer,
12
+ SimpleStepRewardsViewer,
13
+ SimpleStepViewer,
14
+ SimpleTimeSyncViewer,
15
+ } from '@xyo-network/xl1-sdk'
16
+
17
+ import { initEvmProvidersIfAvailable } from '../../init/index.ts'
18
+ import { localLocatorFromConfig } from './localLocatorFromConfig.ts'
19
+ import { remoteLocatorFromConfig } from './remoteLocatorFromConfig.ts'
20
+
21
+ export async function rootLocatorFromConfig(
22
+ context: ActorConfigContext,
23
+ ): Promise<ProviderFactoryLocatorInstance> {
24
+ const { config } = context
25
+ let locator: ProviderFactoryLocatorInstance = new ProviderFactoryLocator(context)
26
+
27
+ locator.registerMany([
28
+ SimpleNetworkStakeViewer.factory<SimpleNetworkStakeViewer>(SimpleNetworkStakeViewer.dependencies, {}),
29
+ SimpleTimeSyncViewer.factory<SimpleTimeSyncViewer>(SimpleTimeSyncViewer.dependencies, {}),
30
+ SimpleStepViewer.factory<SimpleStepViewer>(SimpleStepViewer.dependencies, {}),
31
+ SimpleStepRewardsViewer.factory<SimpleStepRewardsViewer>(SimpleStepRewardsViewer.dependencies, {}),
32
+ SimpleStepRewardsByPositionViewer.factory<SimpleStepRewardsByPositionViewer>(SimpleStepRewardsByPositionViewer.dependencies, {}),
33
+ SimpleStepRewardsByStakerViewer.factory<SimpleStepRewardsByStakerViewer>(SimpleStepRewardsByStakerViewer.dependencies, {}),
34
+ SimpleStepRewardsByStepViewer.factory<SimpleStepRewardsByStepViewer>(SimpleStepRewardsByStepViewer.dependencies, {}),
35
+ SimpleStepRewardsTotalViewer.factory<SimpleStepRewardsTotalViewer>(SimpleStepRewardsTotalViewer.dependencies, {}),
36
+ SimpleBlockValidationViewer.factory<SimpleBlockValidationViewer>(
37
+ SimpleBlockValidationViewer.dependencies,
38
+ { state: validateHydratedBlockState, protocol: validateHydratedBlock },
39
+ ),
40
+ ])
41
+ locator = await initEvmProvidersIfAvailable(locator)
42
+ locator = await (isString(config.remote.rpc?.url)
43
+ ? remoteLocatorFromConfig(context, locator)
44
+ : localLocatorFromConfig(context, locator))
45
+ locator.freeze()
46
+ return locator
47
+ }
@@ -0,0 +1,15 @@
1
+ import { initTelemetry } from '@xyo-network/chain-telemetry'
2
+ import type { Config } from '@xyo-network/xl1-sdk'
3
+
4
+ export async function telemetryContextFromConfig(config: Config, serviceName: string, serviceVersion: string) {
5
+ const { otlpEndpoint } = config.telemetry?.otel ?? {}
6
+ const { path: endpoint = '/metrics', port: port = 9466 } = config.telemetry?.metrics?.scrape ?? {}
7
+ return await initTelemetry({
8
+ attributes: {
9
+ serviceName,
10
+ serviceVersion,
11
+ },
12
+ otlpEndpoint,
13
+ metricsConfig: { endpoint, port },
14
+ })
15
+ }
@@ -0,0 +1,11 @@
1
+ import { deepMerge } from '@xylabs/sdk-js'
2
+ import type { Config } from '@xyo-network/xl1-sdk'
3
+
4
+ export function mergeConfig({ actors, ...baseConfig }: Config) {
5
+ return {
6
+ ...baseConfig,
7
+ actors: actors.map((actor) => {
8
+ return deepMerge(baseConfig, actor)
9
+ }),
10
+ }
11
+ }
@@ -0,0 +1,36 @@
1
+ import { isDefined, isNull } from '@xylabs/sdk-js'
2
+ import { ConfigZod } from '@xyo-network/xl1-sdk'
3
+ import { cosmiconfig } from 'cosmiconfig'
4
+
5
+ /**
6
+ * The name of the configuration file to search for.
7
+ */
8
+ const configName = 'xyo'
9
+
10
+ /**
11
+ * The name of the section within the configuration file to parse.
12
+ */
13
+ const configSection = 'xl1' // Default section in the config file
14
+
15
+ /**
16
+ * Attempts to parse the configuration from a file using cosmiconfig.
17
+ * @returns The parsed configuration object if found and valid, otherwise undefined.
18
+ */
19
+ export async function tryParseConfig(searchPlaces?: string[]) {
20
+ const explorer = cosmiconfig(
21
+ configName,
22
+ {
23
+ cache: true,
24
+ // loaders: { '.ts': TypeScriptLoader() },
25
+ searchPlaces,
26
+ },
27
+ )
28
+ const result = (await explorer.search())?.config
29
+ if (!isNull(result)) {
30
+ const section = result[configSection]
31
+ if (isDefined(section) && typeof section === 'object') {
32
+ return ConfigZod.loose().parse(section)
33
+ }
34
+ }
35
+ return ConfigZod.parse({})
36
+ }
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  assertEx, hexFrom, isDefined, isHex,
3
3
  } from '@xylabs/sdk-js'
4
- import type { Config } from '@xyo-network/xl1-sdk'
4
+ import type { BaseConfigContext } from '@xyo-network/xl1-sdk'
5
5
 
6
- export const canUseChainId = (config: Config): boolean => {
6
+ export const canUseChainId = ({ config }: BaseConfigContext): boolean => {
7
7
  return isDefined(config.evm.chainId)
8
8
  }
9
9
 
10
- export const getChainId = (config: Config) => {
10
+ export const getChainId = ({ config }: BaseConfigContext) => {
11
11
  const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')
12
12
  if (isHex(chainId, { prefix: true })) {
13
13
  const hex = hexFrom(chainId)
@@ -1,6 +1,5 @@
1
- import type { Logger } from '@xylabs/sdk-js'
2
1
  import { assertEx } from '@xylabs/sdk-js'
3
- import type { Config } from '@xyo-network/xl1-sdk'
2
+ import type { BaseConfigContext } from '@xyo-network/xl1-sdk'
4
3
  import type { Provider } from 'ethers'
5
4
 
6
5
  import { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'
@@ -8,16 +7,16 @@ import { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvide
8
7
 
9
8
  let provider: Promise<Provider> | undefined
10
9
 
11
- export const initEvmProvider = async ({ config }: { config: Config; logger?: Logger }): Promise<Provider> => {
10
+ export const initEvmProvider = async (context: BaseConfigContext): Promise<Provider> => {
12
11
  if (provider) return provider
13
- if (canUseInfuraProvider(config)) {
14
- provider = initInfuraProvider(config)
15
- } else if (canUseJsonRpcProvider(config)) {
16
- provider = initJsonRpcProvider(config)
12
+ if (canUseInfuraProvider(context)) {
13
+ provider = initInfuraProvider(context)
14
+ } else if (canUseJsonRpcProvider(context)) {
15
+ provider = initJsonRpcProvider(context)
17
16
  }
18
17
  return assertEx(await provider, () => 'No provider available')
19
18
  }
20
19
 
21
- export const canUseEvmProvider = ({ config }: { config: Config }) => {
22
- return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)
20
+ export const canUseEvmProvider = (context: BaseConfigContext) => {
21
+ return canUseInfuraProvider(context) || canUseJsonRpcProvider(context)
23
22
  }
@@ -1,5 +1,5 @@
1
1
  import { assertEx, isDefined } from '@xylabs/sdk-js'
2
- import type { Config } from '@xyo-network/xl1-sdk'
2
+ import type { BaseConfigContext } from '@xyo-network/xl1-sdk'
3
3
  import type { Provider } from 'ethers'
4
4
  import { InfuraProvider } from 'ethers/providers'
5
5
 
@@ -7,21 +7,23 @@ import { canUseChainId, getChainId } from './initChainId.ts'
7
7
 
8
8
  let instance: Promise<InfuraProvider> | undefined
9
9
 
10
- export const initInfuraProvider = (config: Config): Promise<Provider> => {
10
+ export const initInfuraProvider = (context: BaseConfigContext): Promise<Provider> => {
11
11
  if (instance) return instance
12
- const providerConfig = getInfuraProviderConfig(config)
12
+ const providerConfig = getInfuraProviderConfig(context)
13
13
  instance = Promise.resolve(new InfuraProvider(providerConfig[0], providerConfig[1]))
14
14
  return instance
15
15
  }
16
16
 
17
- export const canUseInfuraProvider = (config: Config): boolean => {
18
- return canUseChainId(config)
17
+ export const canUseInfuraProvider = (context: BaseConfigContext): boolean => {
18
+ const { config } = context
19
+ return canUseChainId(context)
19
20
  && isDefined(config.evm?.infura?.projectId)
20
21
  && isDefined(config.evm?.infura?.projectSecret)
21
22
  }
22
23
 
23
- export const getInfuraProviderConfig = (config: Config) => {
24
+ export const getInfuraProviderConfig = (context: BaseConfigContext) => {
25
+ const { config } = context
24
26
  const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')
25
27
  const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')
26
- return [getChainId(config), projectId, projectSecret] as const
28
+ return [getChainId(context), projectId, projectSecret] as const
27
29
  }
@@ -1,20 +1,22 @@
1
1
  import { assertEx, isDefined } from '@xylabs/sdk-js'
2
- import type { Config } from '@xyo-network/xl1-sdk'
2
+ import type { BaseConfigContext } from '@xyo-network/xl1-sdk'
3
3
  import { JsonRpcProvider } from 'ethers/providers'
4
4
 
5
5
  import { canUseChainId, getChainId } from './initChainId.ts'
6
6
 
7
- export const initJsonRpcProvider = (config: Config) => {
8
- const providerConfig = getJsonRpcProviderConfig(config)
7
+ export const initJsonRpcProvider = (context: BaseConfigContext) => {
8
+ const providerConfig = getJsonRpcProviderConfig(context)
9
9
  return Promise.resolve(new JsonRpcProvider(...providerConfig))
10
10
  }
11
11
 
12
- export const canUseJsonRpcProvider = (config: Config) => {
13
- return canUseChainId(config)
12
+ export const canUseJsonRpcProvider = (context: BaseConfigContext) => {
13
+ const { config } = context
14
+ return canUseChainId(context)
14
15
  && isDefined(config.evm.jsonRpc?.url)
15
16
  }
16
17
 
17
- export const getJsonRpcProviderConfig = (config: Config) => {
18
+ export const getJsonRpcProviderConfig = (context: BaseConfigContext) => {
19
+ const { config } = context
18
20
  const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')
19
- return [jsonRpcUrl, getChainId(config)] as const
21
+ return [jsonRpcUrl, getChainId(context)] as const
20
22
  }
@@ -1,13 +1,9 @@
1
- import type {
2
- IncomingMessage, Server, ServerResponse,
3
- } from 'node:http'
1
+ import type { IncomingMessage, ServerResponse } from 'node:http'
4
2
  import http from 'node:http'
5
3
 
6
- import type { CreatableStatus, Logger } from '@xylabs/sdk-js'
4
+ import type { CreatableStatus } from '@xylabs/sdk-js'
7
5
  import { isDefined } from '@xylabs/sdk-js'
8
- import type {
9
- Config, Initializable, RuntimeStatusMonitor,
10
- } from '@xyo-network/xl1-sdk'
6
+ import type { ActorConfigContext, RuntimeStatusMonitor } from '@xyo-network/xl1-sdk'
11
7
 
12
8
  const sendStatus = (res: ServerResponse, status: CreatableStatus, errorCode: number) => {
13
9
  const statusCode = status === 'started' ? 200 : errorCode
@@ -25,9 +21,12 @@ const notFound = (res: ServerResponse) => {
25
21
  * - /healthz
26
22
  * - /livez
27
23
  * - /readyz
24
+ * @param context The actor configuration context
28
25
  * @param port The port to listen on (default: 8080)
26
+ * @param statusMonitor The runtime status monitor to determine the health status
29
27
  */
30
- const createHealthServer = (port: number, statusMonitor: RuntimeStatusMonitor, logger: Logger) => {
28
+ const createHealthServer = (context: ActorConfigContext, port: number, statusMonitor: RuntimeStatusMonitor) => {
29
+ const { logger } = context
31
30
  const server = http.createServer((req: IncomingMessage, res: ServerResponse) => {
32
31
  const url = req.url ?? ''
33
32
 
@@ -53,18 +52,16 @@ const createHealthServer = (port: number, statusMonitor: RuntimeStatusMonitor, l
53
52
  })
54
53
 
55
54
  server.listen(port, () => {
56
- logger.log(`Health server running on http://localhost:${port}`)
57
- logger.log(' - /healthz')
58
- logger.log(' - /livez')
59
- logger.log(' - /readyz')
55
+ logger?.log(`Health server running on http://localhost:${port}`)
56
+ logger?.log(' - /healthz')
57
+ logger?.log(' - /livez')
58
+ logger?.log(' - /readyz')
60
59
  })
61
60
  return server
62
61
  }
63
62
 
64
- export const initHealthEndpoints: Initializable<{ config: Config; logger: Logger; statusReporter: RuntimeStatusMonitor }, Server | undefined> = (params) => {
65
- const {
66
- config, logger, statusReporter,
67
- } = params
68
- const { healthCheckPort } = config.actors.producer
69
- return isDefined(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : undefined
63
+ export function initHealthEndpoints(context: ActorConfigContext, statusMonitor: RuntimeStatusMonitor) {
64
+ const { config } = context
65
+ const { healthCheckPort } = config
66
+ return isDefined(healthCheckPort) ? createHealthServer(context, healthCheckPort, statusMonitor) : undefined
70
67
  }
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './actor/index.ts'
2
2
  export * from './archivists/index.ts'
3
3
  export * from './buildTelemetryConfig.ts'
4
4
  export * from './ChainInitializableParams.ts'
5
+ export * from './config/index.ts'
5
6
  export * from './createDeclarationIntentBlock.ts'
6
7
  export * from './evm/index.ts'
7
8
  export * from './health/index.ts'
package/src/init/index.ts CHANGED
@@ -1,10 +1,10 @@
1
+ export * from './initActorAccount.ts'
2
+ export * from './initActorSeedPhrase.ts'
1
3
  export * from './initBalanceSummaryMap.ts'
2
4
  export * from './initBridgedModule.ts'
3
5
  export * from './initEvmProvidersIfAvailable.ts'
4
6
  export * from './initFinalizationArchivistIfNeeded.ts'
5
7
  export * from './initFinalizedArchivist.ts'
6
- export * from './initProducerAccount.ts'
7
- export * from './initSeedPhrase.ts'
8
8
  export * from './initServerNode.ts'
9
9
  export * from './initStatusReporter.ts'
10
10
  export * from './initTransferSummaryMap.ts'
@@ -0,0 +1,28 @@
1
+ import type { Promisable } from '@xylabs/sdk-js'
2
+ import { isDefined, isUndefined } from '@xylabs/sdk-js'
3
+ import { HDWallet } from '@xyo-network/wallet'
4
+ import type { WalletInstance } from '@xyo-network/wallet-model'
5
+ import type { ActorConfigContext } from '@xyo-network/xl1-sdk'
6
+ import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from '@xyo-network/xl1-sdk'
7
+
8
+ const actorAccountSingletons: Record<string, Promisable<WalletInstance>> = {}
9
+
10
+ export async function initActorAccount({ config, logger }: Pick<ActorConfigContext, 'config' | 'logger'>): Promise<WalletInstance> {
11
+ const actorName = config.name
12
+ if (isDefined(actorAccountSingletons[actorName])) return actorAccountSingletons[actorName]
13
+ let walletPhrase = config.mnemonic
14
+ if (isUndefined(walletPhrase)) {
15
+ logger?.warn(`[${actorName}}] No wallet mnemonic specified!`)
16
+ const randomMnemonic = HDWallet.generateMnemonic()
17
+ logger?.warn(`[${actorName}}] Using randomly generated mnemonic:
18
+
19
+ ${randomMnemonic}
20
+
21
+ `)
22
+ walletPhrase = randomMnemonic
23
+ }
24
+ const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase)
25
+ const account = await wallet.derivePath(ADDRESS_INDEX.XYO)
26
+ actorAccountSingletons[actorName] = account
27
+ return actorAccountSingletons[actorName]
28
+ }
@@ -1,19 +1,19 @@
1
1
  import { assertEx, isString } from '@xylabs/sdk-js'
2
2
  import type { BiosExternalInterface } from '@xyo-network/bios-model'
3
+ import type { WalletKind } from '@xyo-network/storage-model'
3
4
  import { HDWallet } from '@xyo-network/wallet'
4
-
5
- import type { ConfigContext } from '../ConfigContext.ts'
5
+ import type { ActorConfigContext } from '@xyo-network/xl1-sdk'
6
6
 
7
7
  // TODO: Make nodejs version of bios support round tripping mnemonic between boots
8
- export async function initSeedPhrase({
9
- config, logger, bios,
10
- }: ConfigContext<{ bios: BiosExternalInterface }>): Promise<string> {
11
- const storedSeedPhrase = await bios.seedPhraseStore.get('os')
8
+ export async function initActorSeedPhrase(context: ActorConfigContext, bios: BiosExternalInterface): Promise<string> {
9
+ const { logger, config } = context
10
+ const walletKind = config.name as WalletKind
11
+ const storedSeedPhrase = await bios.seedPhraseStore.get(walletKind)
12
12
  logger?.debug(`[API] Stored mnemonic: ${storedSeedPhrase}`)
13
- const { mnemonic } = config.actors.api
13
+ const { mnemonic } = config
14
14
  if (isString(storedSeedPhrase) && isString(mnemonic)) {
15
15
  logger?.warn('[API] Stored mnemonic does not match supplied. Updating stored mnemonic to supplied.')
16
- await bios.seedPhraseStore.set('os', mnemonic)
16
+ await bios.seedPhraseStore.set(walletKind, mnemonic)
17
17
  } else {
18
18
  let seedPhrase: string
19
19
  if (isString(mnemonic)) {
@@ -23,7 +23,7 @@ export async function initSeedPhrase({
23
23
  logger?.log('[API] No mnemonic provided, using random mnemonic. This is not recommended for production use.')
24
24
  logger?.log(`[API] Mnemonic: ${seedPhrase}`)
25
25
  }
26
- await bios.seedPhraseStore.set('os', seedPhrase)
26
+ await bios.seedPhraseStore.set(walletKind, seedPhrase)
27
27
  }
28
- return assertEx(await bios.seedPhraseStore.get('os'), () => 'Unable to acquire mnemonic from bios')
28
+ return assertEx(await bios.seedPhraseStore.get(walletKind), () => 'Unable to acquire mnemonic from bios')
29
29
  }
@@ -3,12 +3,12 @@ import type { Hash } from '@xylabs/sdk-js'
3
3
  import { assertEx } from '@xylabs/sdk-js'
4
4
  import { MongoMap } from '@xyo-network/chain-protocol'
5
5
  import type { WithStorageMeta } from '@xyo-network/payload-model'
6
- import type { BalancesStepSummary, MapType } from '@xyo-network/xl1-sdk'
6
+ import type {
7
+ BalancesStepSummary, BaseConfigContext, MapType,
8
+ } from '@xyo-network/xl1-sdk'
7
9
  import { hasMongoConfig, MemoryMap } from '@xyo-network/xl1-sdk'
8
10
 
9
- import type { ConfigContext } from '../ConfigContext.ts'
10
-
11
- export async function initBalanceSummaryMap({ config, logger }: ConfigContext): Promise<MapType<string, WithStorageMeta<BalancesStepSummary>>> {
11
+ export async function initBalanceSummaryMap({ logger, config }: BaseConfigContext): Promise<MapType<string, WithStorageMeta<BalancesStepSummary>>> {
12
12
  const mongoConfig = config.storage?.mongo
13
13
  if (hasMongoConfig(mongoConfig)) {
14
14
  // Create the MongoDB SDK from the configuration
@@ -1,11 +1,10 @@
1
- import type { Address, Logger } from '@xylabs/sdk-js'
1
+ import type { Address } from '@xylabs/sdk-js'
2
2
  import { assertEx } from '@xylabs/sdk-js'
3
3
  import type { AttachableArchivistInstance } from '@xyo-network/archivist-model'
4
4
  import { asAttachableArchivistInstance } from '@xyo-network/archivist-model'
5
5
  import type { BridgeInstance } from '@xyo-network/bridge-model'
6
6
  import type { AttachableModuleInstance, ModuleIdentifier } from '@xyo-network/module-model'
7
7
  import { asAttachableModuleInstance } from '@xyo-network/module-model'
8
- import type { Initializable } from '@xyo-network/xl1-sdk'
9
8
  import { Mutex } from 'async-mutex'
10
9
 
11
10
  const initMutex = new Mutex()
@@ -13,9 +12,7 @@ type ModuleDictionary = Record<ModuleIdentifier, AttachableModuleInstance | unde
13
12
  type BridgedModuleDictionary = Record<Address, ModuleDictionary | undefined>
14
13
  const bridgedModuleDictionary: BridgedModuleDictionary = {}
15
14
 
16
- export const initBridgedModule: Initializable<
17
- { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableModuleInstance
18
- > = async ({ bridge, moduleName }): Promise<AttachableModuleInstance> => {
15
+ export async function initBridgedModule({ bridge, moduleName }: { bridge: BridgeInstance; moduleName: ModuleIdentifier }): Promise<AttachableModuleInstance> {
19
16
  return await initMutex.runExclusive(async () => {
20
17
  const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName]
21
18
  if (existing) return existing
@@ -33,9 +30,10 @@ export const initBridgedModule: Initializable<
33
30
  })
34
31
  }
35
32
 
36
- export const initBridgedArchivistModule: Initializable<
37
- { bridge: BridgeInstance; logger?: Logger; moduleName: ModuleIdentifier }, AttachableArchivistInstance
38
- > = async ({ bridge, moduleName }): Promise<AttachableArchivistInstance> => {
33
+ export async function initBridgedArchivistModule({ bridge, moduleName }: {
34
+ bridge: BridgeInstance
35
+ moduleName: ModuleIdentifier
36
+ }): Promise<AttachableArchivistInstance> {
39
37
  return assertEx(
40
38
  asAttachableArchivistInstance(await initBridgedModule({ bridge, moduleName })),
41
39
  () => `Could not convert ${moduleName} to attachable archivist instance`,
@@ -16,10 +16,11 @@ import {
16
16
  import { canUseEvmProvider, initEvmProvider } from '../evm/index.ts'
17
17
 
18
18
  export async function initEvmProvidersIfAvailable(locator: ProviderFactoryLocatorInstance) {
19
- const { config, logger } = locator.context
20
- if (canUseEvmProvider({ config })) {
21
- const chainId = assertEx(config.chain.id as ChainId, () => 'Missing config.chain.chainId (required for EVM providers)')
22
- const provider = await initEvmProvider({ config, logger })
19
+ const context = locator.context
20
+ const { logger, config } = context
21
+ if (canUseEvmProvider(context)) {
22
+ const chainId = assertEx(context.config.chain.id as ChainId, () => 'Missing config.chain.id (required for EVM providers)')
23
+ const provider = await initEvmProvider(context)
23
24
  const address = asEthAddress(chainId, true)
24
25
 
25
26
  // Register the contract events viewer
@@ -53,7 +54,7 @@ export async function initEvmProvidersIfAvailable(locator: ProviderFactoryLocato
53
54
  } else {
54
55
  logger?.warn('EVM provider not available - running with memory based contract/stake viewers')
55
56
  const positions: Position[] = []
56
- const chainId = assertEx(config.chain.id, () => 'Missing config.chain.chainId (required for non-EVM providers)')
57
+ const chainId = assertEx(config.chain.id, () => 'Missing config.chain.id (required for non-EVM providers)')
57
58
 
58
59
  // Register the contract events viewer
59
60
  locator.register(SimpleStakeEventsViewer.factory<SimpleStakeEventsViewer>(
@@ -1,18 +1,21 @@
1
1
  import { assertEx } from '@xylabs/sdk-js'
2
- import { Account } from '@xyo-network/account'
3
2
  import type { AccountInstance } from '@xyo-network/account-model'
4
3
  import type { ArchivistInstance } from '@xyo-network/archivist-model'
5
4
  import { createBootstrapHead } from '@xyo-network/chain-sdk'
5
+ import { Account } from '@xyo-network/sdk-js'
6
+ import type {
7
+ ActorConfig,
8
+ ChainId,
9
+ SignedBlockBoundWitnessWithHashMeta,
10
+ } from '@xyo-network/xl1-sdk'
6
11
  import {
7
- asAttoXL1,
8
- type ChainId, type Config, findMostRecentBlock,
12
+ asAttoXL1, findMostRecentBlock,
9
13
  flattenHydratedBlock,
10
- type SignedBlockBoundWitnessWithHashMeta,
11
14
  } from '@xyo-network/xl1-sdk'
12
15
 
13
16
  export async function initFinalizationArchivistIfNeeded(
14
17
  archivist: ArchivistInstance,
15
- config: Config,
18
+ config: ActorConfig,
16
19
  account: AccountInstance,
17
20
  ): Promise<[SignedBlockBoundWitnessWithHashMeta, ChainId]> {
18
21
  const configuredChainId = config.chain.id
@@ -1,13 +1,9 @@
1
1
  import { assertEx } from '@xylabs/sdk-js'
2
2
  import { asArchivistInstance } from '@xyo-network/archivist-model'
3
3
  import type { NodeInstance } from '@xyo-network/node-model'
4
- import type { WithStorageMeta } from '@xyo-network/payload-model'
5
4
  import type { WalletInstance } from '@xyo-network/wallet-model'
6
- import type {
7
- BalancesStepSummary, MapType, TransfersStepSummary,
8
- } from '@xyo-network/xl1-sdk'
5
+ import type { BaseConfigContext } from '@xyo-network/xl1-sdk'
9
6
 
10
- import type { ConfigContext } from '../ConfigContext.ts'
11
7
  import { loadNode } from '../manifest/index.ts'
12
8
 
13
9
  async function writableChainArchivistFromNode(node: NodeInstance) {
@@ -38,17 +34,12 @@ async function pendingBlocksArchivistFromNode(node: NodeInstance) {
38
34
  )
39
35
  }
40
36
 
41
- export async function initServerNode({
42
- wallet, logger, config, node: providedNode, transfersSummaryMap, balancesSummaryMap,
43
- }: ConfigContext<{
44
- balancesSummaryMap: MapType<string, WithStorageMeta<BalancesStepSummary>>
45
- node?: NodeInstance
46
- transfersSummaryMap: MapType<string, WithStorageMeta<TransfersStepSummary>>
47
- wallet: WalletInstance
48
- }>) {
49
- const node: NodeInstance = providedNode ?? await loadNode({
50
- wallet, logger, config, transfersSummaryMap, balancesSummaryMap,
51
- })
37
+ export async function initServerNode(
38
+ context: BaseConfigContext,
39
+ wallet: WalletInstance,
40
+ providedNode?: NodeInstance,
41
+ ) {
42
+ const node: NodeInstance = providedNode ?? await loadNode(context, wallet)
52
43
  assertEx(await node.start(), () => 'Failed to start node')
53
44
  const writableChainArchivist = await writableChainArchivistFromNode(node)
54
45
  const readonlyChainArchivist = await readonlyChainArchivistFromNode(node)
@@ -3,12 +3,12 @@ import type { Hash } from '@xylabs/sdk-js'
3
3
  import { assertEx } from '@xylabs/sdk-js'
4
4
  import { MongoMap } from '@xyo-network/chain-protocol'
5
5
  import type { WithStorageMeta } from '@xyo-network/payload-model'
6
- import type { MapType, TransfersStepSummary } from '@xyo-network/xl1-sdk'
6
+ import type {
7
+ BaseConfigContext, MapType, TransfersStepSummary,
8
+ } from '@xyo-network/xl1-sdk'
7
9
  import { hasMongoConfig, MemoryMap } from '@xyo-network/xl1-sdk'
8
10
 
9
- import type { ConfigContext } from '../ConfigContext.ts'
10
-
11
- export async function initTransferSummaryMap({ config, logger }: ConfigContext): Promise<MapType<string, WithStorageMeta<TransfersStepSummary>>> {
11
+ export async function initTransferSummaryMap({ logger, config }: BaseConfigContext): Promise<MapType<string, WithStorageMeta<TransfersStepSummary>>> {
12
12
  const mongoConfig = config.storage?.mongo
13
13
  if (hasMongoConfig(mongoConfig)) {
14
14
  // Create the MongoDB SDK from the configuration