@xyo-network/xl1-cli-lib 1.7.4

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 (296) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +46 -0
  3. package/dist/node/commands/api/index.d.ts +2 -0
  4. package/dist/node/commands/api/index.d.ts.map +1 -0
  5. package/dist/node/commands/api/runApi.d.ts +9 -0
  6. package/dist/node/commands/api/runApi.d.ts.map +1 -0
  7. package/dist/node/commands/index.d.ts +4 -0
  8. package/dist/node/commands/index.d.ts.map +1 -0
  9. package/dist/node/commands/producer/index.d.ts +2 -0
  10. package/dist/node/commands/producer/index.d.ts.map +1 -0
  11. package/dist/node/commands/producer/runProducer.d.ts +11 -0
  12. package/dist/node/commands/producer/runProducer.d.ts.map +1 -0
  13. package/dist/node/commands/validator/index.d.ts +2 -0
  14. package/dist/node/commands/validator/index.d.ts.map +1 -0
  15. package/dist/node/commands/validator/runValidator.d.ts +11 -0
  16. package/dist/node/commands/validator/runValidator.d.ts.map +1 -0
  17. package/dist/node/images.d.ts +2 -0
  18. package/dist/node/images.d.ts.map +1 -0
  19. package/dist/node/index.d.ts +4 -0
  20. package/dist/node/index.d.ts.map +1 -0
  21. package/dist/node/index.mjs +1712 -0
  22. package/dist/node/index.mjs.map +1 -0
  23. package/dist/node/initConfig.d.ts +3 -0
  24. package/dist/node/initConfig.d.ts.map +1 -0
  25. package/dist/node/initLogger.d.ts +4 -0
  26. package/dist/node/initLogger.d.ts.map +1 -0
  27. package/dist/node/optionsFromZodSchema.d.ts +4 -0
  28. package/dist/node/optionsFromZodSchema.d.ts.map +1 -0
  29. package/dist/node/orchestration/ChainInitializableParams.d.ts +11 -0
  30. package/dist/node/orchestration/ChainInitializableParams.d.ts.map +1 -0
  31. package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts +18 -0
  32. package/dist/node/orchestration/actor/implementation/BalanceActor.d.ts.map +1 -0
  33. package/dist/node/orchestration/actor/implementation/ChainHeadUpdateActor.d.ts +19 -0
  34. package/dist/node/orchestration/actor/implementation/ChainHeadUpdateActor.d.ts.map +1 -0
  35. package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts +28 -0
  36. package/dist/node/orchestration/actor/implementation/ProducerActor.d.ts.map +1 -0
  37. package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts +26 -0
  38. package/dist/node/orchestration/actor/implementation/ValidatorActor.d.ts.map +1 -0
  39. package/dist/node/orchestration/actor/implementation/index.d.ts +5 -0
  40. package/dist/node/orchestration/actor/implementation/index.d.ts.map +1 -0
  41. package/dist/node/orchestration/actor/index.d.ts +3 -0
  42. package/dist/node/orchestration/actor/index.d.ts.map +1 -0
  43. package/dist/node/orchestration/actor/model/Actor.d.ts +39 -0
  44. package/dist/node/orchestration/actor/model/Actor.d.ts.map +1 -0
  45. package/dist/node/orchestration/actor/model/Orchestrator.d.ts +27 -0
  46. package/dist/node/orchestration/actor/model/Orchestrator.d.ts.map +1 -0
  47. package/dist/node/orchestration/actor/model/index.d.ts +3 -0
  48. package/dist/node/orchestration/actor/model/index.d.ts.map +1 -0
  49. package/dist/node/orchestration/archivists/ChainFinalized/archivist.d.ts +4 -0
  50. package/dist/node/orchestration/archivists/ChainFinalized/archivist.d.ts.map +1 -0
  51. package/dist/node/orchestration/archivists/ChainFinalized/index.d.ts +2 -0
  52. package/dist/node/orchestration/archivists/ChainFinalized/index.d.ts.map +1 -0
  53. package/dist/node/orchestration/archivists/ChainFinalized/local.d.ts +7 -0
  54. package/dist/node/orchestration/archivists/ChainFinalized/local.d.ts.map +1 -0
  55. package/dist/node/orchestration/archivists/ChainFinalized/remote.d.ts +7 -0
  56. package/dist/node/orchestration/archivists/ChainFinalized/remote.d.ts.map +1 -0
  57. package/dist/node/orchestration/archivists/ChainSubmissions/archivist.d.ts +7 -0
  58. package/dist/node/orchestration/archivists/ChainSubmissions/archivist.d.ts.map +1 -0
  59. package/dist/node/orchestration/archivists/ChainSubmissions/index.d.ts +2 -0
  60. package/dist/node/orchestration/archivists/ChainSubmissions/index.d.ts.map +1 -0
  61. package/dist/node/orchestration/archivists/ChainSubmissions/remote.d.ts +7 -0
  62. package/dist/node/orchestration/archivists/ChainSubmissions/remote.d.ts.map +1 -0
  63. package/dist/node/orchestration/archivists/PendingTransactions/archivist.d.ts +6 -0
  64. package/dist/node/orchestration/archivists/PendingTransactions/archivist.d.ts.map +1 -0
  65. package/dist/node/orchestration/archivists/PendingTransactions/index.d.ts +2 -0
  66. package/dist/node/orchestration/archivists/PendingTransactions/index.d.ts.map +1 -0
  67. package/dist/node/orchestration/archivists/PendingTransactions/local.d.ts +7 -0
  68. package/dist/node/orchestration/archivists/PendingTransactions/local.d.ts.map +1 -0
  69. package/dist/node/orchestration/archivists/PendingTransactions/remote.d.ts +7 -0
  70. package/dist/node/orchestration/archivists/PendingTransactions/remote.d.ts.map +1 -0
  71. package/dist/node/orchestration/archivists/RejectedTransactions/archivist.d.ts +4 -0
  72. package/dist/node/orchestration/archivists/RejectedTransactions/archivist.d.ts.map +1 -0
  73. package/dist/node/orchestration/archivists/RejectedTransactions/index.d.ts +2 -0
  74. package/dist/node/orchestration/archivists/RejectedTransactions/index.d.ts.map +1 -0
  75. package/dist/node/orchestration/archivists/RejectedTransactions/local.d.ts +4 -0
  76. package/dist/node/orchestration/archivists/RejectedTransactions/local.d.ts.map +1 -0
  77. package/dist/node/orchestration/archivists/StakeIntentState/archivist.d.ts +5 -0
  78. package/dist/node/orchestration/archivists/StakeIntentState/archivist.d.ts.map +1 -0
  79. package/dist/node/orchestration/archivists/StakeIntentState/index.d.ts +2 -0
  80. package/dist/node/orchestration/archivists/StakeIntentState/index.d.ts.map +1 -0
  81. package/dist/node/orchestration/archivists/StakeIntentState/local.d.ts +7 -0
  82. package/dist/node/orchestration/archivists/StakeIntentState/local.d.ts.map +1 -0
  83. package/dist/node/orchestration/archivists/index.d.ts +6 -0
  84. package/dist/node/orchestration/archivists/index.d.ts.map +1 -0
  85. package/dist/node/orchestration/archivists/lib/index.d.ts +2 -0
  86. package/dist/node/orchestration/archivists/lib/index.d.ts.map +1 -0
  87. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts +20 -0
  88. package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts.map +1 -0
  89. package/dist/node/orchestration/health/index.d.ts +2 -0
  90. package/dist/node/orchestration/health/index.d.ts.map +1 -0
  91. package/dist/node/orchestration/health/initHealthEndpoints.d.ts +11 -0
  92. package/dist/node/orchestration/health/initHealthEndpoints.d.ts.map +1 -0
  93. package/dist/node/orchestration/host/implementation/DefaultHost.d.ts +12 -0
  94. package/dist/node/orchestration/host/implementation/DefaultHost.d.ts.map +1 -0
  95. package/dist/node/orchestration/host/implementation/DefaultServiceCollection.d.ts +24 -0
  96. package/dist/node/orchestration/host/implementation/DefaultServiceCollection.d.ts.map +1 -0
  97. package/dist/node/orchestration/host/implementation/DefaultServiceProvider.d.ts +7 -0
  98. package/dist/node/orchestration/host/implementation/DefaultServiceProvider.d.ts.map +1 -0
  99. package/dist/node/orchestration/host/implementation/index.d.ts +3 -0
  100. package/dist/node/orchestration/host/implementation/index.d.ts.map +1 -0
  101. package/dist/node/orchestration/host/index.d.ts +3 -0
  102. package/dist/node/orchestration/host/index.d.ts.map +1 -0
  103. package/dist/node/orchestration/host/model/Host.d.ts +19 -0
  104. package/dist/node/orchestration/host/model/Host.d.ts.map +1 -0
  105. package/dist/node/orchestration/host/model/ServiceCollection.d.ts +20 -0
  106. package/dist/node/orchestration/host/model/ServiceCollection.d.ts.map +1 -0
  107. package/dist/node/orchestration/host/model/ServiceProvider.d.ts +4 -0
  108. package/dist/node/orchestration/host/model/ServiceProvider.d.ts.map +1 -0
  109. package/dist/node/orchestration/host/model/index.d.ts +4 -0
  110. package/dist/node/orchestration/host/model/index.d.ts.map +1 -0
  111. package/dist/node/orchestration/index.d.ts +6 -0
  112. package/dist/node/orchestration/index.d.ts.map +1 -0
  113. package/dist/node/orchestration/initServices.d.ts +9 -0
  114. package/dist/node/orchestration/initServices.d.ts.map +1 -0
  115. package/dist/node/orchestration/map/BalanceSummary/index.d.ts +2 -0
  116. package/dist/node/orchestration/map/BalanceSummary/index.d.ts.map +1 -0
  117. package/dist/node/orchestration/map/BalanceSummary/initBalanceSummaryMap.d.ts +7 -0
  118. package/dist/node/orchestration/map/BalanceSummary/initBalanceSummaryMap.d.ts.map +1 -0
  119. package/dist/node/orchestration/map/BalanceSummary/local.d.ts +7 -0
  120. package/dist/node/orchestration/map/BalanceSummary/local.d.ts.map +1 -0
  121. package/dist/node/orchestration/map/driver/index.d.ts +2 -0
  122. package/dist/node/orchestration/map/driver/index.d.ts.map +1 -0
  123. package/dist/node/orchestration/map/driver/lmdb/Params.d.ts +7 -0
  124. package/dist/node/orchestration/map/driver/lmdb/Params.d.ts.map +1 -0
  125. package/dist/node/orchestration/map/driver/lmdb/SynchronousLmdbMap.d.ts +32 -0
  126. package/dist/node/orchestration/map/driver/lmdb/SynchronousLmdbMap.d.ts.map +1 -0
  127. package/dist/node/orchestration/map/driver/lmdb/index.d.ts +2 -0
  128. package/dist/node/orchestration/map/driver/lmdb/index.d.ts.map +1 -0
  129. package/dist/node/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.d.ts +2 -0
  130. package/dist/node/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.d.ts.map +1 -0
  131. package/dist/node/orchestration/map/index.d.ts +3 -0
  132. package/dist/node/orchestration/map/index.d.ts.map +1 -0
  133. package/dist/node/orchestration/map/localPersistentMap.d.ts +13 -0
  134. package/dist/node/orchestration/map/localPersistentMap.d.ts.map +1 -0
  135. package/dist/node/orchestration/repository/index.d.ts +2 -0
  136. package/dist/node/orchestration/repository/index.d.ts.map +1 -0
  137. package/dist/node/orchestration/repository/lib/index.d.ts +2 -0
  138. package/dist/node/orchestration/repository/lib/index.d.ts.map +1 -0
  139. package/dist/node/orchestration/repository/lib/repositoryFromArchivist.d.ts +6 -0
  140. package/dist/node/orchestration/repository/lib/repositoryFromArchivist.d.ts.map +1 -0
  141. package/dist/node/orchestration/services/implementation/account.d.ts +7 -0
  142. package/dist/node/orchestration/services/implementation/account.d.ts.map +1 -0
  143. package/dist/node/orchestration/services/implementation/balance.d.ts +4 -0
  144. package/dist/node/orchestration/services/implementation/balance.d.ts.map +1 -0
  145. package/dist/node/orchestration/services/implementation/chain/evm.d.ts +7 -0
  146. package/dist/node/orchestration/services/implementation/chain/evm.d.ts.map +1 -0
  147. package/dist/node/orchestration/services/implementation/chain/index.d.ts +4 -0
  148. package/dist/node/orchestration/services/implementation/chain/index.d.ts.map +1 -0
  149. package/dist/node/orchestration/services/implementation/evm/index.d.ts +2 -0
  150. package/dist/node/orchestration/services/implementation/evm/index.d.ts.map +1 -0
  151. package/dist/node/orchestration/services/implementation/evm/initChainId.d.ts +4 -0
  152. package/dist/node/orchestration/services/implementation/evm/initChainId.d.ts.map +1 -0
  153. package/dist/node/orchestration/services/implementation/evm/initEvmProvider.d.ts +11 -0
  154. package/dist/node/orchestration/services/implementation/evm/initEvmProvider.d.ts.map +1 -0
  155. package/dist/node/orchestration/services/implementation/evm/initInfuraProvider.d.ts +6 -0
  156. package/dist/node/orchestration/services/implementation/evm/initInfuraProvider.d.ts.map +1 -0
  157. package/dist/node/orchestration/services/implementation/evm/initJsonRpcProvider.d.ts +6 -0
  158. package/dist/node/orchestration/services/implementation/evm/initJsonRpcProvider.d.ts.map +1 -0
  159. package/dist/node/orchestration/services/implementation/head.d.ts +10 -0
  160. package/dist/node/orchestration/services/implementation/head.d.ts.map +1 -0
  161. package/dist/node/orchestration/services/implementation/index.d.ts +11 -0
  162. package/dist/node/orchestration/services/implementation/index.d.ts.map +1 -0
  163. package/dist/node/orchestration/services/implementation/iterator.d.ts +6 -0
  164. package/dist/node/orchestration/services/implementation/iterator.d.ts.map +1 -0
  165. package/dist/node/orchestration/services/implementation/pendingTransactions.d.ts +4 -0
  166. package/dist/node/orchestration/services/implementation/pendingTransactions.d.ts.map +1 -0
  167. package/dist/node/orchestration/services/implementation/producer.d.ts +4 -0
  168. package/dist/node/orchestration/services/implementation/producer.d.ts.map +1 -0
  169. package/dist/node/orchestration/services/implementation/reward.d.ts +4 -0
  170. package/dist/node/orchestration/services/implementation/reward.d.ts.map +1 -0
  171. package/dist/node/orchestration/services/implementation/validator.d.ts +4 -0
  172. package/dist/node/orchestration/services/implementation/validator.d.ts.map +1 -0
  173. package/dist/node/orchestration/services/index.d.ts +2 -0
  174. package/dist/node/orchestration/services/index.d.ts.map +1 -0
  175. package/dist/node/orchestration/status/RuntimeStatusMonitor.d.ts +31 -0
  176. package/dist/node/orchestration/status/RuntimeStatusMonitor.d.ts.map +1 -0
  177. package/dist/node/orchestration/status/ServiceStatus.d.ts +9 -0
  178. package/dist/node/orchestration/status/ServiceStatus.d.ts.map +1 -0
  179. package/dist/node/orchestration/status/index.d.ts +3 -0
  180. package/dist/node/orchestration/status/index.d.ts.map +1 -0
  181. package/dist/node/orchestration/store/StoreKind.d.ts +2 -0
  182. package/dist/node/orchestration/store/StoreKind.d.ts.map +1 -0
  183. package/dist/node/orchestration/store/getStoreDirectory.d.ts +10 -0
  184. package/dist/node/orchestration/store/getStoreDirectory.d.ts.map +1 -0
  185. package/dist/node/orchestration/store/index.d.ts +3 -0
  186. package/dist/node/orchestration/store/index.d.ts.map +1 -0
  187. package/dist/node/runCLI.d.ts +2 -0
  188. package/dist/node/runCLI.d.ts.map +1 -0
  189. package/dist/node/spec/BootstrapChain.spec.d.ts +2 -0
  190. package/dist/node/spec/BootstrapChain.spec.d.ts.map +1 -0
  191. package/dist/node/start.d.ts +2 -0
  192. package/dist/node/start.d.ts.map +1 -0
  193. package/dist/node/waitForHostPort.d.ts +2 -0
  194. package/dist/node/waitForHostPort.d.ts.map +1 -0
  195. package/dist/node/xl1.d.ts +2 -0
  196. package/dist/node/xl1.d.ts.map +1 -0
  197. package/dist/node/xl1.mjs +1610 -0
  198. package/dist/node/xl1.mjs.map +1 -0
  199. package/package.json +96 -0
  200. package/src/commands/api/index.ts +1 -0
  201. package/src/commands/api/runApi.ts +12 -0
  202. package/src/commands/index.ts +3 -0
  203. package/src/commands/producer/index.ts +1 -0
  204. package/src/commands/producer/runProducer.ts +38 -0
  205. package/src/commands/validator/index.ts +1 -0
  206. package/src/commands/validator/runValidator.ts +38 -0
  207. package/src/images.ts +19 -0
  208. package/src/index.ts +3 -0
  209. package/src/initConfig.ts +6 -0
  210. package/src/initLogger.ts +23 -0
  211. package/src/optionsFromZodSchema.ts +69 -0
  212. package/src/orchestration/ChainInitializableParams.ts +12 -0
  213. package/src/orchestration/actor/implementation/BalanceActor.ts +50 -0
  214. package/src/orchestration/actor/implementation/ChainHeadUpdateActor.ts +65 -0
  215. package/src/orchestration/actor/implementation/ProducerActor.ts +244 -0
  216. package/src/orchestration/actor/implementation/ValidatorActor.ts +113 -0
  217. package/src/orchestration/actor/implementation/index.ts +4 -0
  218. package/src/orchestration/actor/index.ts +2 -0
  219. package/src/orchestration/actor/model/Actor.ts +114 -0
  220. package/src/orchestration/actor/model/Orchestrator.ts +71 -0
  221. package/src/orchestration/actor/model/index.ts +2 -0
  222. package/src/orchestration/archivists/ChainFinalized/archivist.ts +29 -0
  223. package/src/orchestration/archivists/ChainFinalized/index.ts +1 -0
  224. package/src/orchestration/archivists/ChainFinalized/local.ts +18 -0
  225. package/src/orchestration/archivists/ChainFinalized/remote.ts +20 -0
  226. package/src/orchestration/archivists/ChainSubmissions/archivist.ts +20 -0
  227. package/src/orchestration/archivists/ChainSubmissions/index.ts +1 -0
  228. package/src/orchestration/archivists/ChainSubmissions/remote.ts +20 -0
  229. package/src/orchestration/archivists/PendingTransactions/archivist.ts +29 -0
  230. package/src/orchestration/archivists/PendingTransactions/index.ts +1 -0
  231. package/src/orchestration/archivists/PendingTransactions/local.ts +21 -0
  232. package/src/orchestration/archivists/PendingTransactions/remote.ts +20 -0
  233. package/src/orchestration/archivists/RejectedTransactions/archivist.ts +18 -0
  234. package/src/orchestration/archivists/RejectedTransactions/index.ts +1 -0
  235. package/src/orchestration/archivists/RejectedTransactions/local.ts +20 -0
  236. package/src/orchestration/archivists/StakeIntentState/archivist.ts +21 -0
  237. package/src/orchestration/archivists/StakeIntentState/index.ts +1 -0
  238. package/src/orchestration/archivists/StakeIntentState/local.ts +19 -0
  239. package/src/orchestration/archivists/index.ts +5 -0
  240. package/src/orchestration/archivists/lib/index.ts +1 -0
  241. package/src/orchestration/archivists/lib/localPersistentArchivist.ts +57 -0
  242. package/src/orchestration/health/index.ts +1 -0
  243. package/src/orchestration/health/initHealthEndpoints.ts +72 -0
  244. package/src/orchestration/host/implementation/DefaultHost.ts +25 -0
  245. package/src/orchestration/host/implementation/DefaultServiceCollection.ts +60 -0
  246. package/src/orchestration/host/implementation/DefaultServiceProvider.ts +12 -0
  247. package/src/orchestration/host/implementation/index.ts +2 -0
  248. package/src/orchestration/host/index.ts +2 -0
  249. package/src/orchestration/host/model/Host.ts +21 -0
  250. package/src/orchestration/host/model/ServiceCollection.ts +22 -0
  251. package/src/orchestration/host/model/ServiceProvider.ts +3 -0
  252. package/src/orchestration/host/model/index.ts +3 -0
  253. package/src/orchestration/index.ts +5 -0
  254. package/src/orchestration/initServices.ts +240 -0
  255. package/src/orchestration/map/BalanceSummary/index.ts +1 -0
  256. package/src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts +22 -0
  257. package/src/orchestration/map/BalanceSummary/local.ts +21 -0
  258. package/src/orchestration/map/driver/index.ts +1 -0
  259. package/src/orchestration/map/driver/lmdb/Params.ts +7 -0
  260. package/src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts +66 -0
  261. package/src/orchestration/map/driver/lmdb/index.ts +1 -0
  262. package/src/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.ts +97 -0
  263. package/src/orchestration/map/index.ts +2 -0
  264. package/src/orchestration/map/localPersistentMap.ts +52 -0
  265. package/src/orchestration/repository/index.ts +1 -0
  266. package/src/orchestration/repository/lib/index.ts +1 -0
  267. package/src/orchestration/repository/lib/repositoryFromArchivist.ts +27 -0
  268. package/src/orchestration/services/implementation/account.ts +24 -0
  269. package/src/orchestration/services/implementation/balance.ts +13 -0
  270. package/src/orchestration/services/implementation/chain/evm.ts +38 -0
  271. package/src/orchestration/services/implementation/chain/index.ts +22 -0
  272. package/src/orchestration/services/implementation/evm/index.ts +1 -0
  273. package/src/orchestration/services/implementation/evm/initChainId.ts +20 -0
  274. package/src/orchestration/services/implementation/evm/initEvmProvider.ts +23 -0
  275. package/src/orchestration/services/implementation/evm/initInfuraProvider.ts +27 -0
  276. package/src/orchestration/services/implementation/evm/initJsonRpcProvider.ts +21 -0
  277. package/src/orchestration/services/implementation/head.ts +44 -0
  278. package/src/orchestration/services/implementation/index.ts +10 -0
  279. package/src/orchestration/services/implementation/iterator.ts +36 -0
  280. package/src/orchestration/services/implementation/pendingTransactions.ts +14 -0
  281. package/src/orchestration/services/implementation/producer.ts +13 -0
  282. package/src/orchestration/services/implementation/reward.ts +41 -0
  283. package/src/orchestration/services/implementation/validator.ts +14 -0
  284. package/src/orchestration/services/index.ts +1 -0
  285. package/src/orchestration/status/RuntimeStatusMonitor.ts +117 -0
  286. package/src/orchestration/status/ServiceStatus.ts +21 -0
  287. package/src/orchestration/status/index.ts +2 -0
  288. package/src/orchestration/store/StoreKind.ts +1 -0
  289. package/src/orchestration/store/getStoreDirectory.ts +14 -0
  290. package/src/orchestration/store/index.ts +2 -0
  291. package/src/runCLI.ts +111 -0
  292. package/src/spec/BootstrapChain.spec.ts +133 -0
  293. package/src/spec/MultiProducer.ChainOutput.json +864 -0
  294. package/src/start.ts +8 -0
  295. package/src/waitForHostPort.ts +26 -0
  296. package/src/xl1.ts +8 -0
@@ -0,0 +1,1712 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/orchestration/actor/implementation/BalanceActor.ts
5
+ import { assertEx } from "@xylabs/assert";
6
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
7
+ import { Mutex } from "async-mutex";
8
+
9
+ // src/orchestration/actor/model/Actor.ts
10
+ import { Base } from "@xylabs/base";
11
+ import { forget } from "@xylabs/forget";
12
+ import { IdLogger } from "@xylabs/logger";
13
+ import { span, spanAsync } from "@xylabs/telemetry";
14
+ var Actor = class extends Base {
15
+ static {
16
+ __name(this, "Actor");
17
+ }
18
+ _timers = /* @__PURE__ */ new Map();
19
+ _active = false;
20
+ _displayName;
21
+ _id;
22
+ constructor(id, displayName = "Actor", params) {
23
+ const logger = params.logger ?? new IdLogger(Base.defaultLogger ?? console, () => `[${displayName} (${id})] `);
24
+ super({
25
+ ...params,
26
+ logger
27
+ });
28
+ this._displayName = displayName;
29
+ this._id = id;
30
+ }
31
+ get displayName() {
32
+ return this._displayName;
33
+ }
34
+ get id() {
35
+ return this._id;
36
+ }
37
+ get name() {
38
+ return this.constructor.name;
39
+ }
40
+ get logPrefix() {
41
+ return `[${this.displayName} (${this.id})] `;
42
+ }
43
+ /**
44
+ * The timer runs until the actor is deactivated (or you manually stop it).
45
+ */
46
+ registerTimer(timerName, callback, dueTimeMs, periodMs) {
47
+ if (!this._active) {
48
+ this.logger?.warn(`Cannot register timer '${timerName}' because actor is not active.`);
49
+ return;
50
+ }
51
+ const schedulePeriodicRun = /* @__PURE__ */ __name(async () => {
52
+ if (!this._active || !this._timers.has(timerName)) return;
53
+ try {
54
+ await callback();
55
+ } catch (error) {
56
+ this.logger?.error(`Error in timer '${this.name}:${timerName}': ${error}`);
57
+ } finally {
58
+ this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), {
59
+ name: `schedulePeriodicRun:${this.name}:${timerName}`
60
+ }), periodMs));
61
+ }
62
+ }, "schedulePeriodicRun");
63
+ this._timers.set(timerName, setTimeout(() => forget(schedulePeriodicRun(), {
64
+ name: `schedulePeriodicRun(initial):${this.name}:${timerName}`
65
+ }), dueTimeMs));
66
+ this.logger?.log(`Timer '${this.name}:${timerName}' registered: first call after ${dueTimeMs}ms, recurring every ${periodMs}ms.`);
67
+ }
68
+ span(name, fn) {
69
+ return span(`${this.name}:${name}`, fn, this.tracer);
70
+ }
71
+ async spanAsync(name, fn) {
72
+ return await spanAsync(`${this.name}:${name}`, fn, this.tracer);
73
+ }
74
+ /**
75
+ * Called by the Orchestrator when the actor is activated.
76
+ */
77
+ async start() {
78
+ await Promise.resolve();
79
+ this._active = true;
80
+ this.logger?.log("Started.");
81
+ }
82
+ /**
83
+ * Called by the Orchestrator when the actor is deactivated.
84
+ * Stop all running timers.
85
+ */
86
+ async stop() {
87
+ await Promise.resolve();
88
+ this._active = false;
89
+ this.logger?.log("Stopping all timers...");
90
+ for (const [, timerRef] of this._timers.entries()) {
91
+ clearTimeout(timerRef);
92
+ }
93
+ this._timers.clear();
94
+ this.logger?.log("Stopped.");
95
+ }
96
+ };
97
+
98
+ // src/orchestration/actor/model/Orchestrator.ts
99
+ var Orchestrator = class {
100
+ static {
101
+ __name(this, "Orchestrator");
102
+ }
103
+ actors = [];
104
+ keepAliveHandle = null;
105
+ logger;
106
+ running = false;
107
+ constructor(logger) {
108
+ this.logger = logger;
109
+ }
110
+ /**
111
+ * Registers an actor.
112
+ * (We won't activate the actor until `start()` is called.)
113
+ */
114
+ async registerActor(actor) {
115
+ if (this.running) {
116
+ await actor.start();
117
+ }
118
+ this.actors.push(actor);
119
+ }
120
+ /**
121
+ * Starts the orchestrator: activates all actors.
122
+ */
123
+ async start() {
124
+ await Promise.resolve();
125
+ if (this.running) {
126
+ this.logger?.warn("[Orchestrator] Already started.");
127
+ return;
128
+ }
129
+ this.logger?.log("[Orchestrator] Starting...");
130
+ this.running = true;
131
+ for (const actor of this.actors) {
132
+ await actor.start();
133
+ }
134
+ this.keepAliveHandle = setInterval(() => {
135
+ }, 2147483647);
136
+ }
137
+ /**
138
+ * Stops the orchestrator: deactivates all actors.
139
+ */
140
+ async stop() {
141
+ await Promise.resolve();
142
+ if (!this.running) {
143
+ this.logger?.log("[Orchestrator] Already stopped.");
144
+ return;
145
+ }
146
+ this.logger?.log("[Orchestrator] Stopping...");
147
+ for (const actor of this.actors) {
148
+ await actor.stop();
149
+ }
150
+ this.running = false;
151
+ if (this.keepAliveHandle) clearInterval(this.keepAliveHandle);
152
+ this.logger?.log("[Orchestrator] Stopped...");
153
+ }
154
+ };
155
+
156
+ // src/orchestration/actor/implementation/BalanceActor.ts
157
+ var BalanceActor = class _BalanceActor extends Actor {
158
+ static {
159
+ __name(this, "BalanceActor");
160
+ }
161
+ _updateMutex = new Mutex();
162
+ constructor(params) {
163
+ super("BalanceActor", "Balance", params);
164
+ }
165
+ get balanceService() {
166
+ return assertEx(this.params.balanceService, () => "balanceService not set");
167
+ }
168
+ get chainIterator() {
169
+ return assertEx(this.params.chainIterator, () => "chainIterator not set");
170
+ }
171
+ static create(params) {
172
+ return new _BalanceActor(params);
173
+ }
174
+ async start() {
175
+ await super.start();
176
+ this.chainIterator.on("headUpdate", async () => {
177
+ await this.updateBalance();
178
+ });
179
+ this.registerTimer("BalanceTimer", async () => {
180
+ await this.updateBalance();
181
+ }, 1e3, 1e3);
182
+ }
183
+ async updateBalance() {
184
+ if (this._updateMutex.isLocked()) return;
185
+ await this._updateMutex.runExclusive(async () => {
186
+ const head = await PayloadBuilder.hash(await this.chainIterator.head());
187
+ await this.balanceService.balances(head, []);
188
+ });
189
+ }
190
+ };
191
+
192
+ // src/orchestration/actor/implementation/ChainHeadUpdateActor.ts
193
+ import { filterAs } from "@xylabs/array";
194
+ import { assertEx as assertEx2 } from "@xylabs/assert";
195
+ import { toHex } from "@xylabs/hex";
196
+ import { findMostRecentBlock, sortBlocks } from "@xyo-network/chain-protocol";
197
+ import { asBlockBoundWitness } from "@xyo-network/xl1-protocol";
198
+ var ChainHeadUpdateActor = class _ChainHeadUpdateActor extends Actor {
199
+ static {
200
+ __name(this, "ChainHeadUpdateActor");
201
+ }
202
+ constructor(params) {
203
+ super("ChainHeadUpdate", "ChainHeadUpdate", params);
204
+ }
205
+ get chainFinalizedArchivist() {
206
+ return assertEx2(this.params.chainArchivist, () => "ChainArchivist not set");
207
+ }
208
+ get chainIterator() {
209
+ return assertEx2(this.params.chainIterator, () => "chainIterator not set");
210
+ }
211
+ static create(params) {
212
+ return new _ChainHeadUpdateActor(params);
213
+ }
214
+ async start() {
215
+ await super.start();
216
+ this.chainFinalizedArchivist.on("inserted", async (data) => {
217
+ await this.checkInsertedForNewHead(data);
218
+ });
219
+ this.registerTimer("ChainHeadUpdateTimer", async () => await this.pollForNewHead(), 0, 250);
220
+ }
221
+ async checkInsertedForNewHead(data) {
222
+ const candidateBlock = sortBlocks(filterAs(data.payloads, asBlockBoundWitness)).at(-1);
223
+ await this.updateHeadIfNewer(candidateBlock);
224
+ }
225
+ async pollForNewHead() {
226
+ const candidateBlock = await findMostRecentBlock(this.chainFinalizedArchivist);
227
+ await this.updateHeadIfNewer(candidateBlock);
228
+ }
229
+ async updateHeadIfNewer(candidateBlock) {
230
+ if (!candidateBlock) return;
231
+ const currentHead = await this.chainIterator.head();
232
+ const candidateBlockNumber = candidateBlock.block;
233
+ const candidateBlockNumberDisplay = `0x${toHex(candidateBlockNumber)}`;
234
+ const currentBlockNumber = currentHead?.block ?? -1;
235
+ if (candidateBlockNumber > currentBlockNumber) {
236
+ this.logger?.log("Found more recent head:", candidateBlockNumberDisplay);
237
+ await this.chainIterator.updateHead(candidateBlock);
238
+ this.logger?.log("Updated head:", candidateBlockNumberDisplay);
239
+ }
240
+ }
241
+ };
242
+
243
+ // src/orchestration/actor/implementation/ProducerActor.ts
244
+ import { assertEx as assertEx3 } from "@xylabs/assert";
245
+ import { toHex as toHex2 } from "@xylabs/hex";
246
+ import { isDefined, isUndefined } from "@xylabs/typeof";
247
+ import { createDeclarationIntent } from "@xyo-network/chain-protocol";
248
+ import { BaseBlockProducerService } from "@xyo-network/chain-services";
249
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
250
+ import { PayloadBundleSchema } from "@xyo-network/payload-model";
251
+ import { buildTransaction, flattenHydratedBlock, flattenHydratedTransaction } from "@xyo-network/xl1-protocol-sdk";
252
+ var SHOULD_REGISTER_REDECLARATION_INTENT_TIMER = true;
253
+ var TEN_MINUTES = 10 * 60 * 1e3;
254
+ var ProducerActor = class _ProducerActor extends Actor {
255
+ static {
256
+ __name(this, "ProducerActor");
257
+ }
258
+ _lastProducedBlock;
259
+ _lastRedeclarationIntent;
260
+ constructor(params) {
261
+ super(params.producer.address, "Producer", params);
262
+ }
263
+ get account() {
264
+ return assertEx3(this.params.account, () => "account not set");
265
+ }
266
+ get balanceService() {
267
+ return assertEx3(this.params.balanceService, () => "balanceService not set");
268
+ }
269
+ get chainIterator() {
270
+ return assertEx3(this.params.chainIterator, () => "chainIterator not set");
271
+ }
272
+ get chainStakeViewer() {
273
+ return assertEx3(this.params.chainStakeViewer, () => "chainStakeViewer not set");
274
+ }
275
+ get chainSubmissionsArchivistWrite() {
276
+ return assertEx3(this.params.chainSubmissionsArchivistWrite, () => "chainSubmissionsArchivistWrite not set");
277
+ }
278
+ get pendingBundledTransactionsArchivistWrite() {
279
+ return assertEx3(this.params.pendingBundledTransactionsArchivistWrite, () => "pendingBundledTransactionsArchivistWrite not set");
280
+ }
281
+ get producer() {
282
+ return assertEx3(this.params.producer, () => "producer not set");
283
+ }
284
+ get stakeIntentService() {
285
+ return assertEx3(this.params.stakeIntentService, () => "stakeIntentService not set");
286
+ }
287
+ static create(params) {
288
+ return new _ProducerActor(params);
289
+ }
290
+ async start() {
291
+ await super.start();
292
+ this.registerTimer("BlockProductionTimer", async () => {
293
+ await this.spanAsync("produceBlock", async () => {
294
+ const head = await this.chainIterator.head();
295
+ const headHash = await PayloadBuilder2.hash(head);
296
+ if (this._lastProducedBlock && this._lastProducedBlock[0].previous === headHash) {
297
+ this.logger?.log("Block already produced:", `0x${toHex2(this._lastProducedBlock[0].block)}`);
298
+ } else {
299
+ const nextBlock = await this.producer.next(head);
300
+ if (nextBlock) {
301
+ const displayBlockNumber = `0x${toHex2(nextBlock[0].block)}`;
302
+ this.logger?.log("Produced block:", displayBlockNumber);
303
+ await this.chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(nextBlock));
304
+ this.logger?.log("Published block:", displayBlockNumber);
305
+ this._lastProducedBlock = nextBlock;
306
+ }
307
+ }
308
+ });
309
+ }, 100, 500);
310
+ if (SHOULD_REGISTER_REDECLARATION_INTENT_TIMER) {
311
+ this.registerTimer("ProducerRedeclarationTimer", async () => {
312
+ await this.spanAsync("producerRedeclarationTimer", async () => {
313
+ if (this.params.config.producer.disableIntentRedeclaration) return;
314
+ const head = await this.chainIterator.head();
315
+ if (isUndefined(head)) return;
316
+ const currentBlock = head.block;
317
+ const blocksUntilExpiration = await this.calculateBlocksUntilProducerDeclarationExpiration(currentBlock);
318
+ if (blocksUntilExpiration > BaseBlockProducerService.RedeclarationWindow * 0.1) {
319
+ this._lastRedeclarationIntent = void 0;
320
+ return;
321
+ }
322
+ if (this._lastRedeclarationIntent) {
323
+ if (this._lastRedeclarationIntent.exp > currentBlock) return;
324
+ this._lastRedeclarationIntent = void 0;
325
+ }
326
+ if (!await this.validateCurrentBalance()) {
327
+ this.logger?.error(`Add balance to address ${this.account.address} for the producer to declare it's intent.`);
328
+ return;
329
+ }
330
+ if (!await this.validateCurrentStake()) {
331
+ this.logger?.error(`Add stake to contract address ${this.params.config.chain.id} for the producer to declare it's intent.`);
332
+ return;
333
+ }
334
+ this.logger?.log("Creating redeclaration intent for producer:", this.account.address);
335
+ const redeclarationIntent = createDeclarationIntent(this.account.address, "producer", currentBlock, currentBlock + BaseBlockProducerService.RedeclarationDuration);
336
+ await this.submitRedeclarationIntent(currentBlock, redeclarationIntent);
337
+ this._lastRedeclarationIntent = redeclarationIntent;
338
+ });
339
+ }, 1e4, TEN_MINUTES);
340
+ }
341
+ }
342
+ async calculateBlocksUntilProducerDeclarationExpiration(currentBlock) {
343
+ const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.account.address, "producer");
344
+ const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1);
345
+ const [, currentDeclarationEnd] = lastRange || [
346
+ void 0,
347
+ currentBlock
348
+ ];
349
+ const timeToProducerExpiration = currentDeclarationEnd - currentBlock;
350
+ return timeToProducerExpiration;
351
+ }
352
+ async submitRedeclarationIntent(currentBlock, redeclarationIntent) {
353
+ this.logger?.log("Submitting redeclaration intent for producer:", this.account.address);
354
+ const tx = await buildTransaction(this.chainIterator.chainId, [
355
+ redeclarationIntent
356
+ ], [], this.account, currentBlock, currentBlock + 1e3);
357
+ const payloads = flattenHydratedTransaction(tx);
358
+ const root = tx[0]._hash;
359
+ const payloadBundle = new PayloadBuilder2({
360
+ schema: PayloadBundleSchema
361
+ }).fields({
362
+ payloads,
363
+ root
364
+ }).build();
365
+ await this.pendingBundledTransactionsArchivistWrite.insert([
366
+ payloadBundle
367
+ ]);
368
+ this.logger?.log("Submitted redeclaration intent for producer:", this.account.address);
369
+ }
370
+ async validateCurrentBalance() {
371
+ const head = this._lastProducedBlock?.[0]._hash;
372
+ if (isDefined(head)) {
373
+ const balances = await this.balanceService.balances(head, [
374
+ this.account.address
375
+ ]);
376
+ const currentBalance = balances[this.account.address] ?? 0n;
377
+ if (currentBalance <= 0n) {
378
+ this.logger?.error(`Producer ${this.account.address} has no balance.`);
379
+ return false;
380
+ }
381
+ return true;
382
+ }
383
+ return true;
384
+ }
385
+ async validateCurrentStake() {
386
+ const requiredMinimumStake = this.stakeIntentService.getRequiredMinimumStakeForIntent("producer");
387
+ const currentStake = await this.chainStakeViewer.activeByAddressStaked(this.account.address);
388
+ if (currentStake < requiredMinimumStake) {
389
+ this.logger?.error(`Producer ${this.account.address} has insufficient stake.`);
390
+ return false;
391
+ }
392
+ return true;
393
+ }
394
+ };
395
+
396
+ // src/orchestration/actor/implementation/ValidatorActor.ts
397
+ import { assertEx as assertEx4 } from "@xylabs/assert";
398
+ import { toHex as toHex3 } from "@xylabs/hex";
399
+ import { isDefined as isDefined2, isUndefined as isUndefined2 } from "@xylabs/typeof";
400
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
401
+ var ValidatorActor = class _ValidatorActor extends Actor {
402
+ static {
403
+ __name(this, "ValidatorActor");
404
+ }
405
+ _lastValidatedBlock;
406
+ _lastValidatedBlockHash;
407
+ constructor(params) {
408
+ super("Validator", "Validator", params);
409
+ }
410
+ get account() {
411
+ return assertEx4(this.params.account, () => "account not set");
412
+ }
413
+ get balanceService() {
414
+ return assertEx4(this.params.balanceService, () => "balanceService not set");
415
+ }
416
+ get chainIterator() {
417
+ return assertEx4(this.params.chainIterator, () => "chainIterator not set");
418
+ }
419
+ get chainStakeViewer() {
420
+ return assertEx4(this.params.chainStakeViewer, () => "chainStakeViewer not set");
421
+ }
422
+ get chainSubmissionsArchivistWrite() {
423
+ return assertEx4(this.params.chainSubmissionsArchivistWrite, () => "chainSubmissionsArchivistWrite not set");
424
+ }
425
+ get pendingBundledTransactionsArchivistWrite() {
426
+ return assertEx4(this.params.pendingBundledTransactionsArchivistWrite, () => "pendingBundledTransactionsArchivistWrite not set");
427
+ }
428
+ get stakeIntentService() {
429
+ return assertEx4(this.params.stakeIntentService, () => "stakeIntentService not set");
430
+ }
431
+ // protected get validator() {
432
+ // return assertEx(this.params.validator, () => 'validator not set')
433
+ // }
434
+ static create(params) {
435
+ return new _ValidatorActor(params);
436
+ }
437
+ async start() {
438
+ await super.start();
439
+ this.registerTimer("BlockProductionTimer", async () => {
440
+ await this.spanAsync("produceBlock", async () => {
441
+ const block = await this.chainIterator.head();
442
+ if (isUndefined2(block)) return;
443
+ const hash = await PayloadBuilder3.hash(block);
444
+ if (isDefined2(this._lastValidatedBlock) && this._lastValidatedBlockHash === hash) {
445
+ this.logger?.log("Block already validated:", `0x${toHex3(block.block)}`);
446
+ } else {
447
+ this.logger?.log("Validating block:", `0x${toHex3(block.block)}`);
448
+ const valid = await this.validateBlock(block);
449
+ if (valid) {
450
+ this.logger?.log("Validated block:", `0x${toHex3(block.block)}`);
451
+ } else {
452
+ this.logger?.log("Invalid block:", `0x${toHex3(block.block)}`);
453
+ await this.slashInvalidBlock(block);
454
+ }
455
+ }
456
+ });
457
+ }, 100, 500);
458
+ }
459
+ async slashInvalidBlock(_block) {
460
+ const slashed = await Promise.resolve(true);
461
+ return slashed;
462
+ }
463
+ async validateBlock(block) {
464
+ const valid = await Promise.resolve(true);
465
+ this._lastValidatedBlock = block;
466
+ this._lastValidatedBlockHash = await PayloadBuilder3.hash(block);
467
+ return valid;
468
+ }
469
+ };
470
+
471
+ // src/orchestration/health/initHealthEndpoints.ts
472
+ import http from "http";
473
+ import { isDefined as isDefined3 } from "@xylabs/typeof";
474
+ var sendStatus = /* @__PURE__ */ __name((res, status, errorCode) => {
475
+ const statusCode = status === "started" ? 200 : errorCode;
476
+ res.writeHead(statusCode, {
477
+ "Content-Type": "application/json"
478
+ });
479
+ res.end(JSON.stringify({
480
+ status
481
+ }));
482
+ }, "sendStatus");
483
+ var notFound = /* @__PURE__ */ __name((res) => {
484
+ res.writeHead(404, {
485
+ "Content-Type": "application/json"
486
+ });
487
+ res.end(JSON.stringify({
488
+ status: "not found"
489
+ }));
490
+ }, "notFound");
491
+ var createHealthServer = /* @__PURE__ */ __name((port, statusMonitor, logger) => {
492
+ const server = http.createServer((req, res) => {
493
+ const url = req.url ?? "";
494
+ const status = statusMonitor.getGlobalStatus();
495
+ switch (url) {
496
+ case "/healthz": {
497
+ sendStatus(res, status, 500);
498
+ break;
499
+ }
500
+ case "/livez": {
501
+ sendStatus(res, status, 503);
502
+ break;
503
+ }
504
+ case "/readyz": {
505
+ sendStatus(res, status, 503);
506
+ break;
507
+ }
508
+ default: {
509
+ notFound(res);
510
+ }
511
+ }
512
+ });
513
+ server.listen(port, () => {
514
+ logger.log(`Health server running on http://localhost:${port}`);
515
+ logger.log(" - /healthz");
516
+ logger.log(" - /livez");
517
+ logger.log(" - /readyz");
518
+ });
519
+ return server;
520
+ }, "createHealthServer");
521
+ var initHealthEndpoints = /* @__PURE__ */ __name((params) => {
522
+ const { config: config3, logger, statusReporter } = params;
523
+ const { healthCheckPort } = config3.producer;
524
+ return isDefined3(healthCheckPort) ? createHealthServer(healthCheckPort, statusReporter, logger) : void 0;
525
+ }, "initHealthEndpoints");
526
+
527
+ // src/orchestration/initServices.ts
528
+ import { assertEx as assertEx17 } from "@xylabs/assert";
529
+ import { asAddress as asAddress2 } from "@xylabs/hex";
530
+ import { isDefined as isDefined10 } from "@xylabs/typeof";
531
+ import { balanceSummaryRepositoryFromMap } from "@xyo-network/chain-modules";
532
+ import { initTelemetry } from "@xyo-network/chain-telemetry";
533
+ import { startupSpanAsync as startupSpanAsync7 } from "@xyo-network/chain-utils";
534
+ import { validateHydratedBlockState } from "@xyo-network/chain-validation";
535
+
536
+ // src/orchestration/archivists/ChainFinalized/archivist.ts
537
+ import { initArchivistSync } from "@xyo-network/chain-orchestration";
538
+ import { startupSpanAsync } from "@xyo-network/chain-utils";
539
+ import { Mutex as Mutex4 } from "async-mutex";
540
+
541
+ // src/orchestration/archivists/ChainFinalized/local.ts
542
+ import { Mutex as Mutex2 } from "async-mutex";
543
+
544
+ // src/orchestration/archivists/lib/localPersistentArchivist.ts
545
+ import { rm } from "fs/promises";
546
+ import Path2 from "path";
547
+ import { LmdbArchivist, LmdbArchivistConfigSchema } from "@xyo-network/archivist-lmdb";
548
+
549
+ // src/orchestration/store/getStoreDirectory.ts
550
+ import Path from "path";
551
+ var getStoreDirectory = /* @__PURE__ */ __name((name, storageRoot, kind) => {
552
+ return kind === void 0 ? Path.join(storageRoot, name) : Path.join(storageRoot, kind, name);
553
+ }, "getStoreDirectory");
554
+
555
+ // src/orchestration/archivists/lib/localPersistentArchivist.ts
556
+ var DEFAULT_STORAGE_ROOT = Path2.join(process.cwd(), ".store");
557
+ var getLocalPersistentArchivist = /* @__PURE__ */ __name((dbName, storeName, storageRoot, kind = "lmdb") => {
558
+ switch (kind) {
559
+ case "lmdb": {
560
+ const root = storageRoot ?? DEFAULT_STORAGE_ROOT;
561
+ return LmdbArchivist.create({
562
+ account: "random",
563
+ config: {
564
+ clearStoreOnStart: false,
565
+ dbName,
566
+ location: getStoreDirectory(dbName, root, "lmdb"),
567
+ schema: LmdbArchivistConfigSchema,
568
+ storeName
569
+ }
570
+ });
571
+ }
572
+ }
573
+ }, "getLocalPersistentArchivist");
574
+
575
+ // src/orchestration/archivists/ChainFinalized/local.ts
576
+ var mutex = new Mutex2();
577
+ var singleton;
578
+ var initLocalChainFinalizedArchivist = /* @__PURE__ */ __name(async ({ config: config3 }) => {
579
+ return await mutex.runExclusive(async () => {
580
+ if (singleton) return singleton;
581
+ const { root } = config3.storage;
582
+ singleton = await getLocalPersistentArchivist("chain", "finalized", root);
583
+ return singleton;
584
+ });
585
+ }, "initLocalChainFinalizedArchivist");
586
+
587
+ // src/orchestration/archivists/ChainFinalized/remote.ts
588
+ import { assertEx as assertEx5 } from "@xylabs/assert";
589
+ import { initBridge, initBridgedArchivistModule } from "@xyo-network/chain-orchestration";
590
+ import { getUrl } from "@xyo-network/xl1-protocol-sdk";
591
+ import { Mutex as Mutex3 } from "async-mutex";
592
+ var mutex2 = new Mutex3();
593
+ var singleton2;
594
+ var initRemoteChainFinalizedArchivist = /* @__PURE__ */ __name(async ({ config: config3 }) => {
595
+ return await mutex2.runExclusive(async () => {
596
+ if (singleton2) return singleton2;
597
+ const { host, port } = config3.api;
598
+ const nodeUrl = getUrl(host, port);
599
+ const bridge = await initBridge(nodeUrl);
600
+ singleton2 = await initBridgedArchivistModule({
601
+ bridge,
602
+ moduleName: "XYOChain:Chain:Finalized"
603
+ });
604
+ return assertEx5(singleton2, () => "Error: RemoteChainFinalizedArchivist failed to initialize");
605
+ });
606
+ }, "initRemoteChainFinalizedArchivist");
607
+
608
+ // src/orchestration/archivists/ChainFinalized/archivist.ts
609
+ var mutex3 = new Mutex4();
610
+ var singleton3;
611
+ async function initChainFinalizedArchivist({ config: config3, logger, traceProvider }) {
612
+ return await mutex3.runExclusive(async () => {
613
+ if (singleton3) return singleton3;
614
+ const [remote, local] = await Promise.all([
615
+ startupSpanAsync("ChainFinalizedArchivist:initRemote", () => initRemoteChainFinalizedArchivist({
616
+ config: config3,
617
+ logger
618
+ })),
619
+ startupSpanAsync("ChainFinalizedArchivist:initLocal", () => initLocalChainFinalizedArchivist({
620
+ config: config3,
621
+ logger
622
+ }))
623
+ ]);
624
+ await startupSpanAsync("ChainFinalizedArchivist:initArchivistSync", () => initArchivistSync("ChainFinalizedArchivist", remote, local, 200, Number.MAX_SAFE_INTEGER, traceProvider));
625
+ singleton3 = local;
626
+ return singleton3;
627
+ });
628
+ }
629
+ __name(initChainFinalizedArchivist, "initChainFinalizedArchivist");
630
+
631
+ // src/orchestration/archivists/ChainSubmissions/archivist.ts
632
+ import { assertEx as assertEx7 } from "@xylabs/assert";
633
+ import { startupSpanAsync as startupSpanAsync2 } from "@xyo-network/chain-utils";
634
+ import { Mutex as Mutex6 } from "async-mutex";
635
+
636
+ // src/orchestration/archivists/ChainSubmissions/remote.ts
637
+ import { assertEx as assertEx6 } from "@xylabs/assert";
638
+ import { initBridge as initBridge2, initBridgedArchivistModule as initBridgedArchivistModule2 } from "@xyo-network/chain-orchestration";
639
+ import { getUrl as getUrl2 } from "@xyo-network/xl1-protocol-sdk";
640
+ import { Mutex as Mutex5 } from "async-mutex";
641
+ var mutex4 = new Mutex5();
642
+ var singleton4;
643
+ var initRemoteChainSubmissionsArchivist = /* @__PURE__ */ __name(async ({ config: config3 }) => {
644
+ return await mutex4.runExclusive(async () => {
645
+ if (singleton4) return singleton4;
646
+ const { host, port } = config3.api;
647
+ const nodeUrl = getUrl2(host, port);
648
+ const bridge = await initBridge2(nodeUrl);
649
+ singleton4 = await initBridgedArchivistModule2({
650
+ bridge,
651
+ moduleName: "XYOChain:Chain:Submissions"
652
+ });
653
+ return assertEx6(singleton4, () => new Error("Failed to initialize RemoteChainSubmissionsArchivist"));
654
+ });
655
+ }, "initRemoteChainSubmissionsArchivist");
656
+
657
+ // src/orchestration/archivists/ChainSubmissions/archivist.ts
658
+ var mutex5 = new Mutex6();
659
+ var singleton5;
660
+ var initChainSubmissionsArchivist = /* @__PURE__ */ __name(async (params) => {
661
+ return await mutex5.runExclusive(async () => {
662
+ if (singleton5) return singleton5;
663
+ const remote = await startupSpanAsync2("ChainSubmissionsArchivist:initRemote", () => initRemoteChainSubmissionsArchivist(params));
664
+ singleton5 = remote;
665
+ return assertEx7(singleton5, () => new Error("Failed to initialize ChainSubmissionsArchivist"));
666
+ });
667
+ }, "initChainSubmissionsArchivist");
668
+
669
+ // src/orchestration/archivists/PendingTransactions/archivist.ts
670
+ import { initArchivistSync as initArchivistSync2 } from "@xyo-network/chain-orchestration";
671
+ import { startupSpanAsync as startupSpanAsync3 } from "@xyo-network/chain-utils";
672
+ import { Mutex as Mutex9 } from "async-mutex";
673
+
674
+ // src/orchestration/archivists/PendingTransactions/local.ts
675
+ import { MemoryArchivist, MemoryArchivistConfigSchema } from "@xyo-network/archivist-memory";
676
+ import { Mutex as Mutex7 } from "async-mutex";
677
+ var mutex6 = new Mutex7();
678
+ var singleton6;
679
+ var initLocalPendingTransactionsArchivist = /* @__PURE__ */ __name(async () => {
680
+ return await mutex6.runExclusive(async () => {
681
+ if (singleton6) return singleton6;
682
+ singleton6 = await MemoryArchivist.create({
683
+ account: "random",
684
+ config: {
685
+ schema: MemoryArchivistConfigSchema,
686
+ max: 1e3,
687
+ name: "localPendingTransactions"
688
+ }
689
+ });
690
+ return singleton6;
691
+ });
692
+ }, "initLocalPendingTransactionsArchivist");
693
+
694
+ // src/orchestration/archivists/PendingTransactions/remote.ts
695
+ import { assertEx as assertEx8 } from "@xylabs/assert";
696
+ import { initBridge as initBridge3, initBridgedArchivistModule as initBridgedArchivistModule3 } from "@xyo-network/chain-orchestration";
697
+ import { getUrl as getUrl3 } from "@xyo-network/xl1-protocol-sdk";
698
+ import { Mutex as Mutex8 } from "async-mutex";
699
+ var mutex7 = new Mutex8();
700
+ var singleton7;
701
+ var initRemotePendingTransactionsArchivist = /* @__PURE__ */ __name(async ({ config: config3 }) => {
702
+ return await mutex7.runExclusive(async () => {
703
+ if (singleton7) return singleton7;
704
+ const { host, port } = config3.api;
705
+ const nodeUrl = getUrl3(host, port);
706
+ const bridge = await initBridge3(nodeUrl);
707
+ singleton7 = await initBridgedArchivistModule3({
708
+ bridge,
709
+ moduleName: "XYOChain:Pending:PendingTransactions"
710
+ });
711
+ return assertEx8(singleton7, () => "Error: RemotePendingBundledTransactionsArchivist is undefined");
712
+ });
713
+ }, "initRemotePendingTransactionsArchivist");
714
+
715
+ // src/orchestration/archivists/PendingTransactions/archivist.ts
716
+ var mutex8 = new Mutex9();
717
+ var singleton8;
718
+ var initPendingBundledTransactionsArchivist = /* @__PURE__ */ __name(async (params) => {
719
+ return await mutex8.runExclusive(async () => {
720
+ if (singleton8) return singleton8;
721
+ const remote = await startupSpanAsync3("PendingBundledTransactionsArchivist:initRemote", () => initRemotePendingTransactionsArchivist(params));
722
+ const local = await startupSpanAsync3("PendingBundledTransactionsArchivist:initLocal", () => initLocalPendingTransactionsArchivist(params));
723
+ const start2 = await remote.next({
724
+ limit: 1,
725
+ order: "desc"
726
+ });
727
+ await local.insert(start2);
728
+ await startupSpanAsync3("PendingBundledTransactionsArchivist:initArchivistSync", () => initArchivistSync2("PendingBundledTransactionsArchivist", remote, local));
729
+ singleton8 = [
730
+ local,
731
+ remote
732
+ ];
733
+ return singleton8;
734
+ });
735
+ }, "initPendingBundledTransactionsArchivist");
736
+
737
+ // src/orchestration/archivists/RejectedTransactions/archivist.ts
738
+ import { startupSpanAsync as startupSpanAsync4 } from "@xyo-network/chain-utils";
739
+ import { Mutex as Mutex11 } from "async-mutex";
740
+
741
+ // src/orchestration/archivists/RejectedTransactions/local.ts
742
+ import { MemoryArchivist as MemoryArchivist2, MemoryArchivistConfigSchema as MemoryArchivistConfigSchema2 } from "@xyo-network/archivist-memory";
743
+ import { Mutex as Mutex10 } from "async-mutex";
744
+ var mutex9 = new Mutex10();
745
+ var singleton9;
746
+ var initLocalRejectedTransactionsArchivist = /* @__PURE__ */ __name(async () => {
747
+ return await mutex9.runExclusive(async () => {
748
+ if (singleton9) return singleton9;
749
+ singleton9 = await MemoryArchivist2.create({
750
+ account: "random",
751
+ config: {
752
+ schema: MemoryArchivistConfigSchema2,
753
+ max: 1e3,
754
+ name: "localRejectedTransactions"
755
+ }
756
+ });
757
+ return singleton9;
758
+ });
759
+ }, "initLocalRejectedTransactionsArchivist");
760
+
761
+ // src/orchestration/archivists/RejectedTransactions/archivist.ts
762
+ var mutex10 = new Mutex11();
763
+ var singleton10;
764
+ async function initRejectedTransactionsArchivist(params) {
765
+ return await mutex10.runExclusive(async () => {
766
+ if (singleton10) return singleton10;
767
+ const local = await startupSpanAsync4("RejectedTransactionsArchivist:initLocal", () => initLocalRejectedTransactionsArchivist(params));
768
+ singleton10 = local;
769
+ return singleton10;
770
+ });
771
+ }
772
+ __name(initRejectedTransactionsArchivist, "initRejectedTransactionsArchivist");
773
+
774
+ // src/orchestration/archivists/StakeIntentState/archivist.ts
775
+ import { assertEx as assertEx10 } from "@xylabs/assert";
776
+ import { startupSpanAsync as startupSpanAsync5 } from "@xyo-network/chain-utils";
777
+ import { Mutex as Mutex13 } from "async-mutex";
778
+
779
+ // src/orchestration/archivists/StakeIntentState/local.ts
780
+ import { assertEx as assertEx9 } from "@xylabs/assert";
781
+ import { Mutex as Mutex12 } from "async-mutex";
782
+ var mutex11 = new Mutex12();
783
+ var singleton11;
784
+ var initLocalStakeIntentStateArchivist = /* @__PURE__ */ __name(async ({ config: config3 }) => {
785
+ return await mutex11.runExclusive(async () => {
786
+ if (singleton11) return singleton11;
787
+ const { root } = config3.storage;
788
+ singleton11 = await getLocalPersistentArchivist("stakeIntent", "state", root);
789
+ return assertEx9(singleton11, () => new Error("Failed to initialize stake intent state archivist"));
790
+ });
791
+ }, "initLocalStakeIntentStateArchivist");
792
+
793
+ // src/orchestration/archivists/StakeIntentState/archivist.ts
794
+ var mutex12 = new Mutex13();
795
+ var singleton12;
796
+ var initStakeIntentStateArchivist = /* @__PURE__ */ __name(async (params) => {
797
+ return await mutex12.runExclusive(async () => {
798
+ if (singleton12) return singleton12;
799
+ const local = await startupSpanAsync5("StakeIntentStateArchivist:initLocal", () => initLocalStakeIntentStateArchivist(params));
800
+ singleton12 = local;
801
+ return assertEx10(singleton12, () => "Error: StakeIntentStateArchivist is undefined");
802
+ });
803
+ }, "initStakeIntentStateArchivist");
804
+
805
+ // src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
806
+ import { isDefined as isDefined5 } from "@xylabs/typeof";
807
+ import { startupSpanAsync as startupSpanAsync6 } from "@xyo-network/chain-utils";
808
+ import { Mutex as Mutex15 } from "async-mutex";
809
+
810
+ // src/orchestration/map/BalanceSummary/local.ts
811
+ import { isDefined as isDefined4 } from "@xylabs/typeof";
812
+ import { Mutex as Mutex14 } from "async-mutex";
813
+
814
+ // src/orchestration/map/localPersistentMap.ts
815
+ import { rm as rm2 } from "fs/promises";
816
+ import Path3 from "path";
817
+
818
+ // src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts
819
+ import { AbstractCreatable, creatable } from "@xylabs/creatable";
820
+ import { open } from "lmdb";
821
+ function _ts_decorate(decorators, target, key, desc) {
822
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
823
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
824
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
825
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
826
+ }
827
+ __name(_ts_decorate, "_ts_decorate");
828
+ var SynchronousLmdbMap = class extends AbstractCreatable {
829
+ static {
830
+ __name(this, "SynchronousLmdbMap");
831
+ }
832
+ db;
833
+ rootDatabase;
834
+ /**
835
+ * The path to the LMDB folder where the database is stored.
836
+ * This is constructed from the location and dbName parameters
837
+ * allowing for multiple DBs within the root (by specifying a
838
+ * different storeName).
839
+ * @returns The folder path for the LMDB database.
840
+ */
841
+ get folderPath() {
842
+ return `${this.params.location}/${this.params.dbName}`;
843
+ }
844
+ all() {
845
+ return [
846
+ ...this.db.getRange({})
847
+ ].map((entry) => entry.value);
848
+ }
849
+ clear() {
850
+ this.db.clearSync();
851
+ }
852
+ delete(id) {
853
+ return this.db.removeSync(id);
854
+ }
855
+ get(id) {
856
+ return this.db.get(id);
857
+ }
858
+ has(id) {
859
+ return this.db.doesExist(id);
860
+ }
861
+ set(id, data) {
862
+ this.db.putSync(id, data);
863
+ return this;
864
+ }
865
+ async startHandler() {
866
+ await super.startHandler();
867
+ this.rootDatabase = open({
868
+ path: this.folderPath
869
+ });
870
+ this.db = this.rootDatabase.openDB({
871
+ name: this.params.storeName
872
+ });
873
+ }
874
+ };
875
+ SynchronousLmdbMap = _ts_decorate([
876
+ creatable()
877
+ ], SynchronousLmdbMap);
878
+
879
+ // src/orchestration/map/localPersistentMap.ts
880
+ var DEFAULT_STORAGE_ROOT2 = Path3.join(process.cwd(), ".store");
881
+ var getLocalPersistentMap = /* @__PURE__ */ __name(async (dbName, storeName, storageRoot, kind = "lmdb") => {
882
+ switch (kind) {
883
+ case "lmdb": {
884
+ const root = storageRoot ?? DEFAULT_STORAGE_ROOT2;
885
+ const location = getStoreDirectory(dbName, root, "lmdb");
886
+ const store = await SynchronousLmdbMap.create({
887
+ location,
888
+ dbName,
889
+ storeName
890
+ });
891
+ return store;
892
+ }
893
+ }
894
+ }, "getLocalPersistentMap");
895
+
896
+ // src/orchestration/map/BalanceSummary/local.ts
897
+ var mutex13 = new Mutex14();
898
+ var singleton13;
899
+ var initLocalBalanceSummaryMap = /* @__PURE__ */ __name(async (params) => {
900
+ return await mutex13.runExclusive(async () => {
901
+ if (isDefined4(singleton13)) return singleton13;
902
+ const { root } = params.config.storage;
903
+ singleton13 = await getLocalPersistentMap("balance", "summary", root);
904
+ return singleton13;
905
+ });
906
+ }, "initLocalBalanceSummaryMap");
907
+
908
+ // src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts
909
+ var mutex14 = new Mutex15();
910
+ var singleton14;
911
+ async function initBalanceSummaryMap(params) {
912
+ return await mutex14.runExclusive(async () => {
913
+ if (isDefined5(singleton14)) return singleton14;
914
+ const local = await startupSpanAsync6("BalanceSummaryMap:initLocal", () => initLocalBalanceSummaryMap(params));
915
+ singleton14 = local;
916
+ return singleton14;
917
+ });
918
+ }
919
+ __name(initBalanceSummaryMap, "initBalanceSummaryMap");
920
+
921
+ // src/orchestration/services/implementation/account.ts
922
+ import { isUndefined as isUndefined3 } from "@xylabs/typeof";
923
+ import { ADDRESS_INDEX, generateXyoBaseWalletFromPhrase } from "@xyo-network/chain-protocol";
924
+ import { HDWallet } from "@xyo-network/wallet";
925
+ var accountServiceSingleton;
926
+ var initAccount = /* @__PURE__ */ __name(async ({ config: config3, logger }) => {
927
+ if (accountServiceSingleton) return accountServiceSingleton;
928
+ let walletPhrase = config3.producer.mnemonic;
929
+ if (isUndefined3(walletPhrase)) {
930
+ logger?.log("No wallet mnemonic specified!");
931
+ const randomMnemonic = HDWallet.generateMnemonic();
932
+ logger?.log(`Using randomly generated mnemonic: ${randomMnemonic}`);
933
+ walletPhrase = randomMnemonic;
934
+ }
935
+ const wallet = await generateXyoBaseWalletFromPhrase(walletPhrase);
936
+ const account = await wallet.derivePath(ADDRESS_INDEX.XYO);
937
+ accountServiceSingleton = account;
938
+ return accountServiceSingleton;
939
+ }, "initAccount");
940
+
941
+ // src/orchestration/services/implementation/balance.ts
942
+ import { BaseAccountBalanceService } from "@xyo-network/chain-services";
943
+ var balanceServiceSingleton;
944
+ var initBalanceService = /* @__PURE__ */ __name(async (params) => {
945
+ if (balanceServiceSingleton) return balanceServiceSingleton;
946
+ balanceServiceSingleton = await BaseAccountBalanceService.create(params);
947
+ return balanceServiceSingleton;
948
+ }, "initBalanceService");
949
+
950
+ // src/orchestration/services/implementation/chain/index.ts
951
+ import { MemoryChainService } from "@xyo-network/chain-services";
952
+
953
+ // src/orchestration/services/implementation/chain/evm.ts
954
+ import { assertEx as assertEx15 } from "@xylabs/assert";
955
+ import { asAddress, ZERO_ADDRESS } from "@xylabs/hex";
956
+ import { isDefined as isDefined9 } from "@xylabs/typeof";
957
+ import { EvmChainService } from "@xyo-network/chain-services";
958
+ import { Wallet } from "ethers/wallet";
959
+
960
+ // src/orchestration/services/implementation/evm/initEvmProvider.ts
961
+ import { assertEx as assertEx14 } from "@xylabs/assert";
962
+
963
+ // src/orchestration/services/implementation/evm/initInfuraProvider.ts
964
+ import { assertEx as assertEx12 } from "@xylabs/assert";
965
+ import { isDefined as isDefined7 } from "@xylabs/typeof";
966
+ import { InfuraProvider } from "ethers/providers";
967
+
968
+ // src/orchestration/services/implementation/evm/initChainId.ts
969
+ import { assertEx as assertEx11 } from "@xylabs/assert";
970
+ import { hexFrom, isHex } from "@xylabs/hex";
971
+ import { isDefined as isDefined6 } from "@xylabs/typeof";
972
+ var canUseChainId = /* @__PURE__ */ __name((config3) => {
973
+ return isDefined6(config3.evm.chainId);
974
+ }, "canUseChainId");
975
+ var getChainId = /* @__PURE__ */ __name((config3) => {
976
+ const chainId = assertEx11(config3.evm.chainId, () => "Missing config.evm.chainId");
977
+ if (isHex(chainId, {
978
+ prefix: true
979
+ })) {
980
+ const hex = hexFrom(chainId);
981
+ const parsed = Number.parseInt(hex, 16);
982
+ return parsed;
983
+ } else {
984
+ const parsed = Number.parseInt(chainId, 10);
985
+ return parsed;
986
+ }
987
+ }, "getChainId");
988
+
989
+ // src/orchestration/services/implementation/evm/initInfuraProvider.ts
990
+ var instance;
991
+ var initInfuraProvider = /* @__PURE__ */ __name((config3) => {
992
+ if (instance) return instance;
993
+ const providerConfig = getInfuraProviderConfig(config3);
994
+ instance = Promise.resolve(new InfuraProvider(...providerConfig));
995
+ return instance;
996
+ }, "initInfuraProvider");
997
+ var canUseInfuraProvider = /* @__PURE__ */ __name((config3) => {
998
+ return canUseChainId(config3) && isDefined7(config3.evm?.infura?.projectId) && isDefined7(config3.evm?.infura?.projectSecret);
999
+ }, "canUseInfuraProvider");
1000
+ var getInfuraProviderConfig = /* @__PURE__ */ __name((config3) => {
1001
+ const projectId = assertEx12(config3.evm?.infura?.projectId, () => "Missing config.evm.infura.projectId");
1002
+ const projectSecret = assertEx12(config3.evm?.infura?.projectSecret, () => "Missing config.evm.infura.projectSecret");
1003
+ return [
1004
+ getChainId(config3),
1005
+ projectId,
1006
+ projectSecret
1007
+ ];
1008
+ }, "getInfuraProviderConfig");
1009
+
1010
+ // src/orchestration/services/implementation/evm/initJsonRpcProvider.ts
1011
+ import { assertEx as assertEx13 } from "@xylabs/assert";
1012
+ import { isDefined as isDefined8 } from "@xylabs/typeof";
1013
+ import { JsonRpcProvider } from "ethers/providers";
1014
+ var initJsonRpcProvider = /* @__PURE__ */ __name((config3) => {
1015
+ const providerConfig = getJsonRpcProviderConfig(config3);
1016
+ return Promise.resolve(new JsonRpcProvider(...providerConfig));
1017
+ }, "initJsonRpcProvider");
1018
+ var canUseJsonRpcProvider = /* @__PURE__ */ __name((config3) => {
1019
+ return canUseChainId(config3) && isDefined8(config3.evm.jsonRpc?.url);
1020
+ }, "canUseJsonRpcProvider");
1021
+ var getJsonRpcProviderConfig = /* @__PURE__ */ __name((config3) => {
1022
+ const jsonRpcUrl = assertEx13(config3.evm.jsonRpc?.url, () => "Missing config.evm.jsonRpc.url");
1023
+ return [
1024
+ jsonRpcUrl,
1025
+ getChainId(config3)
1026
+ ];
1027
+ }, "getJsonRpcProviderConfig");
1028
+
1029
+ // src/orchestration/services/implementation/evm/initEvmProvider.ts
1030
+ var provider;
1031
+ var initEvmProvider = /* @__PURE__ */ __name(async ({ config: config3 }) => {
1032
+ if (provider) return provider;
1033
+ if (canUseInfuraProvider(config3)) {
1034
+ provider = initInfuraProvider(config3);
1035
+ } else if (canUseJsonRpcProvider(config3)) {
1036
+ provider = initJsonRpcProvider(config3);
1037
+ }
1038
+ return assertEx14(await provider, () => "Error: No provider available");
1039
+ }, "initEvmProvider");
1040
+ var canUseEvmProvider = /* @__PURE__ */ __name(({ config: config3 }) => {
1041
+ return canUseInfuraProvider(config3) || canUseJsonRpcProvider(config3);
1042
+ }, "canUseEvmProvider");
1043
+
1044
+ // src/orchestration/services/implementation/chain/evm.ts
1045
+ var chainStakeServiceSingleton;
1046
+ var canUseEvmContractChainService = /* @__PURE__ */ __name((config3) => {
1047
+ const { id } = config3.chain;
1048
+ return isDefined9(id) && id !== ZERO_ADDRESS && canUseEvmProvider({
1049
+ config: config3
1050
+ });
1051
+ }, "canUseEvmContractChainService");
1052
+ var initEvmContractChainService = /* @__PURE__ */ __name(async ({ account, config: config3, traceProvider, meterProvider, logger }) => {
1053
+ if (chainStakeServiceSingleton) return chainStakeServiceSingleton;
1054
+ const emvStakingContractAddress = assertEx15(config3.chain.id, () => "Error: config.chain.id is required");
1055
+ const id = assertEx15(asAddress(emvStakingContractAddress), () => "Error: config.chain.id is not a valid address");
1056
+ const provider2 = assertEx15(await initEvmProvider({
1057
+ config: config3
1058
+ }));
1059
+ const privateKey = assertEx15(account.private?.hex, () => "Error: Account does not have a private key");
1060
+ const runner = new Wallet(privateKey, provider2);
1061
+ chainStakeServiceSingleton = EvmChainService.create({
1062
+ id,
1063
+ runner,
1064
+ traceProvider,
1065
+ meterProvider,
1066
+ logger
1067
+ });
1068
+ return await chainStakeServiceSingleton;
1069
+ }, "initEvmContractChainService");
1070
+
1071
+ // src/orchestration/services/implementation/chain/index.ts
1072
+ var chainStakeServiceSingleton2;
1073
+ var initChainService = /* @__PURE__ */ __name(({ account, config: config3 }) => init({
1074
+ config: config3,
1075
+ name: "ChainService",
1076
+ account
1077
+ }), "initChainService");
1078
+ var init = /* @__PURE__ */ __name((params) => {
1079
+ if (chainStakeServiceSingleton2) return chainStakeServiceSingleton2;
1080
+ const { config: config3 } = params;
1081
+ chainStakeServiceSingleton2 = canUseEvmContractChainService(config3) ? initEvmContractChainService({
1082
+ ...params,
1083
+ name: "ChainStakeService"
1084
+ }) : MemoryChainService.create({
1085
+ ...params,
1086
+ name: "ChainStakeService"
1087
+ });
1088
+ return chainStakeServiceSingleton2;
1089
+ }, "init");
1090
+
1091
+ // src/orchestration/services/implementation/head.ts
1092
+ import { delay } from "@xylabs/delay";
1093
+ import { ZERO_ADDRESS as ZERO_ADDRESS2 } from "@xylabs/hex";
1094
+ import { createGenesisBlock, findMostRecentBlock as findMostRecentBlock2 } from "@xyo-network/chain-protocol";
1095
+ import { flattenHydratedBlock as flattenHydratedBlock2 } from "@xyo-network/xl1-protocol-sdk";
1096
+ var headSingleton;
1097
+ var createBootstrapHead = /* @__PURE__ */ __name(async (chainSubmissionsArchivistWrite, chainArchivist, account) => {
1098
+ const block = await createGenesisBlock(account, ZERO_ADDRESS2, 10000000n, account.address);
1099
+ const [bw] = block;
1100
+ await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock2(block));
1101
+ while (true) {
1102
+ const result = await chainArchivist.get([
1103
+ bw._hash
1104
+ ]);
1105
+ if (result.length > 0) break;
1106
+ await delay(1e3);
1107
+ }
1108
+ return bw;
1109
+ }, "createBootstrapHead");
1110
+ var initHead = /* @__PURE__ */ __name(async (params) => {
1111
+ const { account, chainArchivist, chainSubmissionsArchivistWrite } = params;
1112
+ if (headSingleton) return headSingleton;
1113
+ let head = await findMostRecentBlock2(chainArchivist);
1114
+ if (!head) head = await createBootstrapHead(chainSubmissionsArchivistWrite, chainArchivist, account);
1115
+ headSingleton = head;
1116
+ return headSingleton;
1117
+ }, "initHead");
1118
+
1119
+ // src/orchestration/services/implementation/iterator.ts
1120
+ import { BaseElectionService, ChainBlockNumberIterationService, XyoStakeIntentService } from "@xyo-network/chain-services";
1121
+ var chainIteratorServiceSingleton;
1122
+ var stakeIntentServiceSingleton;
1123
+ var electionServiceSingleton;
1124
+ var initChainIterator = /* @__PURE__ */ __name((params) => {
1125
+ if (chainIteratorServiceSingleton) return chainIteratorServiceSingleton;
1126
+ chainIteratorServiceSingleton = ChainBlockNumberIterationService.create(params);
1127
+ return chainIteratorServiceSingleton;
1128
+ }, "initChainIterator");
1129
+ var initStakeIntentService = /* @__PURE__ */ __name((params) => {
1130
+ if (stakeIntentServiceSingleton) return stakeIntentServiceSingleton;
1131
+ stakeIntentServiceSingleton = XyoStakeIntentService.create(params);
1132
+ return stakeIntentServiceSingleton;
1133
+ }, "initStakeIntentService");
1134
+ var initElectionService = /* @__PURE__ */ __name((params) => {
1135
+ if (electionServiceSingleton) return electionServiceSingleton;
1136
+ electionServiceSingleton = BaseElectionService.create(params);
1137
+ return electionServiceSingleton;
1138
+ }, "initElectionService");
1139
+
1140
+ // src/orchestration/services/implementation/pendingTransactions.ts
1141
+ import { BasePendingTransactionsService } from "@xyo-network/chain-services";
1142
+ var serviceSingleton;
1143
+ var initPendingTransactions = /* @__PURE__ */ __name(async (params) => {
1144
+ if (serviceSingleton) return serviceSingleton;
1145
+ serviceSingleton = await BasePendingTransactionsService.create(params);
1146
+ return serviceSingleton;
1147
+ }, "initPendingTransactions");
1148
+
1149
+ // src/orchestration/services/implementation/producer.ts
1150
+ import { BaseBlockProducerService as BaseBlockProducerService2 } from "@xyo-network/chain-services";
1151
+ var serviceSingleton2;
1152
+ var initBlockProducer = /* @__PURE__ */ __name(async (params) => {
1153
+ if (serviceSingleton2) return serviceSingleton2;
1154
+ serviceSingleton2 = await BaseBlockProducerService2.create(params);
1155
+ return serviceSingleton2;
1156
+ }, "initBlockProducer");
1157
+
1158
+ // src/orchestration/services/implementation/reward.ts
1159
+ import { assertEx as assertEx16 } from "@xylabs/assert";
1160
+ import { EvmBlockRewardService, MemoryBlockRewardService } from "@xyo-network/chain-services";
1161
+ var rewardServiceSingleton;
1162
+ var initBlockRewardService = /* @__PURE__ */ __name((params) => {
1163
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1164
+ const { config: config3 } = params;
1165
+ rewardServiceSingleton = canUseEvmBlockRewardService({
1166
+ config: config3
1167
+ }) ? initEvmBlockRewardService(params) : initXyoBlockRewardService(params);
1168
+ return rewardServiceSingleton;
1169
+ }, "initBlockRewardService");
1170
+ var initXyoBlockRewardService = /* @__PURE__ */ __name((params) => {
1171
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1172
+ rewardServiceSingleton = MemoryBlockRewardService.create(params);
1173
+ return rewardServiceSingleton;
1174
+ }, "initXyoBlockRewardService");
1175
+ var canUseEvmBlockRewardService = /* @__PURE__ */ __name((params) => canUseEvmProvider({
1176
+ config: params.config
1177
+ }), "canUseEvmBlockRewardService");
1178
+ var initEvmBlockRewardService = /* @__PURE__ */ __name(async (params) => {
1179
+ if (rewardServiceSingleton) return rewardServiceSingleton;
1180
+ const { account: paramsAccount } = params;
1181
+ const account = assertEx16(paramsAccount, () => "Error: Account is required");
1182
+ const provider2 = assertEx16(await initEvmProvider(params));
1183
+ const evmBlockRewardServiceParams = {
1184
+ ...params,
1185
+ provider: provider2,
1186
+ account
1187
+ };
1188
+ rewardServiceSingleton = EvmBlockRewardService.create(evmBlockRewardServiceParams);
1189
+ return rewardServiceSingleton;
1190
+ }, "initEvmBlockRewardService");
1191
+
1192
+ // src/orchestration/services/implementation/validator.ts
1193
+ var serviceSingleton3;
1194
+ var initValidator = /* @__PURE__ */ __name((params) => {
1195
+ if (serviceSingleton3) return serviceSingleton3;
1196
+ serviceSingleton3 = initBlockProducer(params);
1197
+ return serviceSingleton3;
1198
+ }, "initValidator");
1199
+
1200
+ // src/orchestration/status/ServiceStatus.ts
1201
+ var LoggerStatusReporter = class {
1202
+ static {
1203
+ __name(this, "LoggerStatusReporter");
1204
+ }
1205
+ logger;
1206
+ statusMap = {};
1207
+ constructor(logger) {
1208
+ this.logger = logger;
1209
+ }
1210
+ report(name, status, progress) {
1211
+ this.statusMap[name] = status;
1212
+ const starting = Object.entries(this.statusMap).map(([, value]) => value === "starting" ? 1 : 0).reduce((a, b) => a + b, 0);
1213
+ const started = Object.entries(this.statusMap).map(([, value]) => value === "started" ? 1 : 0).reduce((a, b) => a + b, 0);
1214
+ this.logger.info(`${started}/${starting + started} ${name} status: ${status}`, {
1215
+ progress
1216
+ });
1217
+ }
1218
+ };
1219
+
1220
+ // src/orchestration/status/RuntimeStatusMonitor.ts
1221
+ var statusPriority = {
1222
+ error: 0,
1223
+ stopped: 1,
1224
+ stopping: 2,
1225
+ creating: 3,
1226
+ created: 4,
1227
+ starting: 5,
1228
+ started: 6
1229
+ };
1230
+ var SENTINEL_STATUS = "starting";
1231
+ var reduceToMinimumStatus = /* @__PURE__ */ __name((statuses) => {
1232
+ let minStatus = SENTINEL_STATUS;
1233
+ let minPriority = Infinity;
1234
+ for (const status of statuses) {
1235
+ const priority = statusPriority[status];
1236
+ if (priority < minPriority) {
1237
+ minPriority = priority;
1238
+ minStatus = status;
1239
+ }
1240
+ }
1241
+ return minStatus;
1242
+ }, "reduceToMinimumStatus");
1243
+ var RuntimeStatusMonitor = class extends LoggerStatusReporter {
1244
+ static {
1245
+ __name(this, "RuntimeStatusMonitor");
1246
+ }
1247
+ globalTransitions = [];
1248
+ transitions = [];
1249
+ getGlobalStatus() {
1250
+ if (Object.keys(this.statusMap).length === 0) return SENTINEL_STATUS;
1251
+ return reduceToMinimumStatus(Object.values(this.statusMap));
1252
+ }
1253
+ getStatus(name) {
1254
+ return this.statusMap[name];
1255
+ }
1256
+ onGlobalTransition(match, handler) {
1257
+ this.globalTransitions.push({
1258
+ ...match,
1259
+ handler
1260
+ });
1261
+ }
1262
+ /**
1263
+ * Register a callback to be called on a specific transition.
1264
+ */
1265
+ onTransition(match, handler) {
1266
+ this.transitions.push({
1267
+ ...match,
1268
+ handler
1269
+ });
1270
+ }
1271
+ report(name, status, progress) {
1272
+ const previous = this.statusMap[name];
1273
+ const previousGlobal = this.getGlobalStatus();
1274
+ super.report(name, status, progress);
1275
+ if (previous === status) return;
1276
+ this.runTransitions(this.transitions, previous, status, name);
1277
+ const globalStatus = this.getGlobalStatus();
1278
+ if (previousGlobal === globalStatus) return;
1279
+ this.runTransitions(this.globalTransitions, previousGlobal, globalStatus);
1280
+ }
1281
+ runTransitions(transitions, prev, next, name) {
1282
+ for (const { from, to, name: matchName, handler } of transitions) {
1283
+ if ((matchName === void 0 || matchName === name) && (from === void 0 || from === prev) && (to === void 0 || to === next)) {
1284
+ handler(prev, next);
1285
+ }
1286
+ }
1287
+ }
1288
+ };
1289
+
1290
+ // src/orchestration/initServices.ts
1291
+ var telemetryConfig = {
1292
+ attributes: {
1293
+ serviceName: "xl1-producer",
1294
+ serviceVersion: "1.0.0"
1295
+ },
1296
+ metricsConfig: {
1297
+ endpoint: "/metrics",
1298
+ port: 9464
1299
+ }
1300
+ };
1301
+ var isStartable = /* @__PURE__ */ __name((value) => {
1302
+ return isDefined10(value.start) && typeof value.start === "function";
1303
+ }, "isStartable");
1304
+ var initServices = /* @__PURE__ */ __name(async (context) => {
1305
+ const { config: config3, logger } = context;
1306
+ const statusReporter = new RuntimeStatusMonitor(logger);
1307
+ statusReporter.onGlobalTransition({
1308
+ to: "started"
1309
+ }, () => {
1310
+ logger.log("All services started.");
1311
+ });
1312
+ statusReporter.onGlobalTransition({
1313
+ to: "error"
1314
+ }, () => {
1315
+ logger.error("Producer encountered an unhandled error!");
1316
+ process.exit(1);
1317
+ });
1318
+ await startupSpanAsync7("initHealthEndpoints", () => initHealthEndpoints({
1319
+ ...context,
1320
+ statusReporter
1321
+ }));
1322
+ const [{ traceProvider, meterProvider }, account] = await Promise.all([
1323
+ startupSpanAsync7("initTelemetry", () => initTelemetry(telemetryConfig)),
1324
+ startupSpanAsync7("initAccount", () => initAccount(context))
1325
+ ]);
1326
+ const initParams = {
1327
+ config: config3,
1328
+ logger,
1329
+ meterProvider,
1330
+ statusReporter,
1331
+ traceProvider
1332
+ };
1333
+ const [chainArchivist, [pendingBundledTransactionsArchivist, pendingBundledTransactionsArchivistWrite], rejectedTransactionsArchivist, chainSubmissionsArchivistWrite, stakeIntentStateArchivist, chainService, balanceSummaryMap] = await Promise.all([
1334
+ startupSpanAsync7("ChainFinalizedArchivist", () => initChainFinalizedArchivist(initParams)),
1335
+ startupSpanAsync7("PendingBundledTransactionsArchivist", () => initPendingBundledTransactionsArchivist(initParams)),
1336
+ startupSpanAsync7("RejectedTransactionsArchivist", () => initRejectedTransactionsArchivist(initParams)),
1337
+ startupSpanAsync7("ChainSubmissionsArchivist", () => initChainSubmissionsArchivist(initParams)),
1338
+ startupSpanAsync7("StakeIntentStateArchivist", () => initStakeIntentStateArchivist(initParams)),
1339
+ startupSpanAsync7("ChainService", () => initChainService({
1340
+ ...initParams,
1341
+ account,
1342
+ name: "ChainService"
1343
+ })),
1344
+ startupSpanAsync7("BalanceSummaryMap", () => initBalanceSummaryMap(initParams))
1345
+ ]);
1346
+ const chainId = chainService.chainId;
1347
+ const chainContractViewer = chainService;
1348
+ const chainStakeViewer = chainService;
1349
+ const chainStaker = chainService;
1350
+ const head = await startupSpanAsync7("initHead", () => initHead({
1351
+ ...initParams,
1352
+ account,
1353
+ chainArchivist,
1354
+ chainSubmissionsArchivistWrite
1355
+ }));
1356
+ const [pendingTransactionsService, rewardService, chainIterator, balanceService] = await Promise.all([
1357
+ startupSpanAsync7("PendingTransactions", () => initPendingTransactions({
1358
+ name: "PendingTransactionsService",
1359
+ chainArchivist,
1360
+ chainId,
1361
+ pendingBundledTransactionsArchivist,
1362
+ rejectedTransactionsArchivist,
1363
+ ...initParams
1364
+ })),
1365
+ startupSpanAsync7("RewardService", () => initBlockRewardService({
1366
+ name: "RewardService",
1367
+ account,
1368
+ chainService,
1369
+ ...initParams
1370
+ })),
1371
+ startupSpanAsync7("ChainIterator", () => initChainIterator({
1372
+ name: "ChainIterator",
1373
+ chainArchivist,
1374
+ head,
1375
+ ...initParams
1376
+ })),
1377
+ startupSpanAsync7("BalanceService", () => initBalanceService({
1378
+ name: "BalanceService",
1379
+ chainArchivist,
1380
+ summaryRepository: balanceSummaryRepositoryFromMap(balanceSummaryMap),
1381
+ ...initParams
1382
+ }))
1383
+ ]);
1384
+ const stakeIntentService = await startupSpanAsync7("StakeIntentService", () => initStakeIntentService({
1385
+ name: "StakeIntentService",
1386
+ chainArchivist,
1387
+ chainIterator,
1388
+ chainStakeViewer,
1389
+ stakeIntentStateArchivist,
1390
+ ...initParams
1391
+ }));
1392
+ const electionService = await startupSpanAsync7("ElectionService", () => initElectionService({
1393
+ name: "ElectionService",
1394
+ chainIterator,
1395
+ chainStakeViewer,
1396
+ stakeIntentService,
1397
+ ...initParams
1398
+ }));
1399
+ const validatorParams = {
1400
+ name: "Validator",
1401
+ account,
1402
+ chainId,
1403
+ pendingBundledTransactionsArchivist,
1404
+ chainArchivist,
1405
+ electionService,
1406
+ rewardService,
1407
+ stakeIntentService,
1408
+ validateHydratedBlockState,
1409
+ ...initParams
1410
+ };
1411
+ const rewardAddress = isDefined10(config3.producer.rewardAddress) ? assertEx17(asAddress2(config3.producer.rewardAddress), () => "Invalid block reward address provided") : account.address;
1412
+ const producerParams = {
1413
+ ...validatorParams,
1414
+ name: "Producer",
1415
+ balanceService,
1416
+ chainArchivist,
1417
+ pendingBundledTransactionsArchivist,
1418
+ pendingTransactionsService,
1419
+ rejectedTransactionsArchivist,
1420
+ rewardAddress,
1421
+ ...initParams
1422
+ };
1423
+ const producer = await startupSpanAsync7("Producer", () => initBlockProducer(producerParams));
1424
+ const result = {
1425
+ account,
1426
+ balanceService,
1427
+ chainArchivist,
1428
+ chainContractViewer,
1429
+ chainIterator,
1430
+ chainStaker,
1431
+ chainStakeViewer,
1432
+ chainSubmissionsArchivistWrite,
1433
+ electionService,
1434
+ pendingBundledTransactionsArchivistWrite,
1435
+ pendingTransactionsService,
1436
+ producer,
1437
+ rewardService,
1438
+ stakeIntentService
1439
+ };
1440
+ logger?.log("All services created. Starting...");
1441
+ const startableServices = [
1442
+ balanceSummaryMap,
1443
+ ...Object.values(result)
1444
+ ].filter(isStartable);
1445
+ await Promise.all(startableServices.map((service) => service.start()));
1446
+ return result;
1447
+ }, "initServices");
1448
+
1449
+ // src/runCLI.ts
1450
+ import { isDefined as isDefined12 } from "@xylabs/typeof";
1451
+ import { ConfigSchema } from "@xyo-network/xl1-protocol-sdk";
1452
+ import yargs from "yargs";
1453
+ import { hideBin } from "yargs/helpers";
1454
+ import { ZodError } from "zod";
1455
+
1456
+ // src/commands/api/runApi.ts
1457
+ import { getServer } from "@xyo-network/chain-api";
1458
+ function runApi(context) {
1459
+ void getServer(context);
1460
+ }
1461
+ __name(runApi, "runApi");
1462
+
1463
+ // src/commands/producer/runProducer.ts
1464
+ var runProducer = /* @__PURE__ */ __name(async (context) => {
1465
+ const { config: config3, logger, orchestrator } = context;
1466
+ logger?.log("Services: Initializing...");
1467
+ const services = await initServices(context);
1468
+ logger?.log("Services: Initialized");
1469
+ const params = {
1470
+ ...services,
1471
+ config: config3
1472
+ };
1473
+ const chainHeadUpdate = await ChainHeadUpdateActor.create(params);
1474
+ const balances = await BalanceActor.create(params);
1475
+ const producer = await ProducerActor.create(params);
1476
+ const actors = [
1477
+ chainHeadUpdate,
1478
+ balances,
1479
+ producer
1480
+ ];
1481
+ for (const actor of actors) {
1482
+ await orchestrator.registerActor(actor);
1483
+ }
1484
+ await orchestrator.start();
1485
+ }, "runProducer");
1486
+
1487
+ // src/images.ts
1488
+ var XL1LogoColorizedAscii = `\x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;118;111;144m_\x1B[0m
1489
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;72;32;223m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m
1490
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\u2560\u2560\x1B[0m\x1B[38;2;103;85;170m_\x1B[0m
1491
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;79;121;152m\u2566\x1B[0m\x1B[38;2;82;121;151m\u2566\x1B[0m\x1B[38;2;112;125;136m_\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;88;59;196m[\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;73;34;221m\u2592\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;121;121;127m_\x1B[0m\x1B[38;2;100;101;128m\u2554\x1B[0m\x1B[38;2;93;94;127m\u2566\x1B[0m
1492
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;82;121;151m\xB2\x1B[0m\x1B[38;2;44;116;170m\u2560\x1B[0m\x1B[38;2;44;116;171m\u2592\x1B[0m\x1B[38;2;51;117;167mD\x1B[0m\x1B[38;2;80;121;152m\u2566\x1B[0m\x1B[38;2;111;125;136m_\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;67;23;232m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;120;121;128m_\x1B[0m\x1B[38;2;100;101;127m\u2554\x1B[0m\x1B[38;2;79;81;127mR\x1B[0m\x1B[38;2;71;73;128m\u2592\x1B[0m\x1B[38;2;71;73;128m\u2592\x1B[0m\x1B[38;2;88;90;127m\u2559\x1B[0m
1493
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;55;117;165m\u255A\x1B[0m\x1B[38;2;44;116;171m\u2592\x1B[0m\x1B[38;2;44;116;171m\u2592\u2592\x1B[0m\x1B[38;2;50;116;167mD\x1B[0m\x1B[38;2;80;121;152m\u2566\xA0\x1B[0m\x1B[38;2;106;90;165mj\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\x1B[0m\x1B[38;2;89;61;194mH\xA0\x1B[0m\x1B[38;2;99;100;127m\u2554\x1B[0m\x1B[38;2;79;80;127mD\x1B[0m\x1B[38;2;71;73;128m\u2592\x1B[0m\x1B[38;2;71;73;128m\u2592\u2592\u2560\x1B[0m
1494
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;83;121;150m\xB2\x1B[0m\x1B[38;2;44;116;170m\u2592\x1B[0m\x1B[38;2;44;116;171m\u2592\u2592\u2592\xA0\x1B[0m\x1B[38;2;76;38;217m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\u2560\xA0\x1B[0m\x1B[38;2;74;76;128m\u2560\x1B[0m\x1B[38;2;71;73;128m\u2592\u2592\u2592\x1B[0m\x1B[38;2;89;90;128m\u2559\x1B[0m
1495
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;90;118;148m\`\x1B[0m\x1B[38;2;89;107;153m_\x1B[0m\x1B[38;2;93;97;154m,\x1B[0m\x1B[38;2;105;89;166m\u2553\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\u2560\u2560\x1B[0m\x1B[38;2;95;72;183m\u2553\x1B[0m\x1B[38;2;106;96;152m_\x1B[0m\x1B[38;2;100;94;143m\`\x1B[0m\x1B[38;2;101;100;133m\`\x1B[0m
1496
+ \x1B[38;2;128;128;128m\xA0\x1B[0m\x1B[38;2;122;118;137m_\x1B[0m\x1B[38;2;113;102;153m,\x1B[0m\x1B[38;2;108;94;161m\u2553\x1B[0m\x1B[38;2;104;86;169m\u2553\x1B[0m\x1B[38;2;98;77;178m\u2554\x1B[0m\x1B[38;2;93;67;188m\u2557\x1B[0m\x1B[38;2;88;59;196m\u03C6\x1B[0m\x1B[38;2;83;51;204m@\x1B[0m\x1B[38;2;78;42;213mD\x1B[0m\x1B[38;2;72;32;223m\u2592\x1B[0m\x1B[38;2;68;24;231m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\x1B[0m\x1B[38;2;71;30;225m\u2592\x1B[0m\x1B[38;2;77;40;215m\u2592\x1B[0m\x1B[38;2;82;49;206mK\x1B[0m\x1B[38;2;87;57;198m\u03C6\x1B[0m\x1B[38;2;91;65;190m\u2557\x1B[0m\x1B[38;2;97;75;180m\u2566\x1B[0m\x1B[38;2;103;84;171m\u2556\x1B[0m\x1B[38;2;107;92;163m\xB2\x1B[0m\x1B[38;2;112;101;154m_\x1B[0m\x1B[38;2;119;112;143m_\x1B[0m
1497
+ \x1B[38;2;128;128;128m\xA0\x1B[0m\x1B[38;2;106;91;164m\`\x1B[0m\x1B[38;2;94;70;185m^\x1B[0m\x1B[38;2;89;62;193m\u2559\x1B[0m\x1B[38;2;85;54;201m\u2559\x1B[0m\x1B[38;2;80;45;210m\u255A\x1B[0m\x1B[38;2;74;35;220m\u255D\x1B[0m\x1B[38;2;69;26;229m\u2560\x1B[0m\x1B[38;2;66;22;233m\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\u2560\x1B[0m\x1B[38;2;73;33;222m\u255D\x1B[0m\x1B[38;2;79;43;212m\u2569\x1B[0m\x1B[38;2;84;52;203m\u255C\x1B[0m\x1B[38;2;88;60;195m\u2559\x1B[0m\x1B[38;2;93;68;187m^\x1B[0m\x1B[38;2;100;80;175m\`\x1B[0m
1498
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;113;84;152m\`\x1B[0m\x1B[38;2;103;79;169m'\x1B[0m\x1B[38;2;95;72;183m"\x1B[0m\x1B[38;2;87;57;198m\u2559\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\u2560\u2560\x1B[0m\x1B[38;2;80;46;209m\u255C\x1B[0m\x1B[38;2;94;70;185m^\x1B[0m\x1B[38;2;102;77;175m^\x1B[0m\x1B[38;2;112;81;162m\`\x1B[0m\x1B[38;2;115;92;155m\`\x1B[0m
1499
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;145;116;107m,\x1B[0m\x1B[38;2;199;82;45m\u2560\x1B[0m\x1B[38;2;207;77;35m\u2592\x1B[0m\x1B[38;2;207;77;35m\u2592\u2560\xA0\x1B[0m\x1B[38;2;70;28;227m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\u2560\xA0\x1B[0m\x1B[38;2;189;49;97m\xE5\x1B[0m\x1B[38;2;203;32;90m\u2560\x1B[0m\x1B[38;2;203;32;90m\u2560\u2560\x1B[0m\x1B[38;2;155;92;114m,\x1B[0m
1500
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;175;98;73m\u2554\x1B[0m\x1B[38;2;207;77;35m\u2592\x1B[0m\x1B[38;2;207;77;35m\u2592\u2592\u2592\x1B[0m\x1B[38;2;197;83;47m\u2569\xA0\x1B[0m\x1B[38;2;98;76;179m[\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\x1B[0m\x1B[38;2;81;48;207mH\xA0\x1B[0m\x1B[38;2;188;51;98m\u255A\x1B[0m\x1B[38;2;203;32;90m\u2560\x1B[0m\x1B[38;2;203;32;90m\u2560\u2560\u2560\x1B[0m\x1B[38;2;183;57;100mH\x1B[0m
1501
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;146;116;106m,\x1B[0m\x1B[38;2;199;82;44m\u2560\x1B[0m\x1B[38;2;207;77;35m\u2592\x1B[0m\x1B[38;2;207;77;35m\u2592\x1B[0m\x1B[38;2;196;84;48m\u2569\x1B[0m\x1B[38;2;168;102;81m^\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\u2560\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;160;87;111m'\x1B[0m\x1B[38;2;187;52;98m\u255A\x1B[0m\x1B[38;2;203;32;90m\u2560\x1B[0m\x1B[38;2;203;32;90m\u2560\u2560\x1B[0m\x1B[38;2;156;91;113m,\x1B[0m
1502
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;198;83;46m\u2569\x1B[0m\x1B[38;2;194;85;50m\u2569\x1B[0m\x1B[38;2;167;102;82m^\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;81;46;209m\u255A\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\u2560\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;159;88;112m'\x1B[0m\x1B[38;2;186;53;98m\u255A\x1B[0m\x1B[38;2;197;40;93m\u2569\x1B[0m
1503
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;110;97;158m'\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m\x1B[38;2;94;69;186mH\x1B[0m
1504
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;68;25;230m\u2560\x1B[0m\x1B[38;2;66;21;234m\u2560\x1B[0m
1505
+ \x1B[38;2;128;128;128m\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\x1B[0m\x1B[38;2;108;93;162m\xB2\x1B[0m\x1B[38;2;99;79;176m^\x1B[0m`;
1506
+
1507
+ // src/initLogger.ts
1508
+ import { Base as Base2 } from "@xylabs/base";
1509
+ import { ConsoleLogger, LogLevel, SilentLogger } from "@xylabs/logger";
1510
+ import { isDefined as isDefined11 } from "@xylabs/typeof";
1511
+ var initLogger = /* @__PURE__ */ __name((config3) => {
1512
+ let logger;
1513
+ if (config3.silent) {
1514
+ logger = new SilentLogger();
1515
+ } else {
1516
+ let level;
1517
+ if (isDefined11(config3.logLevel)) {
1518
+ const parsed = LogLevel[config3.logLevel.toLowerCase()];
1519
+ if (isDefined11(parsed)) level = parsed;
1520
+ }
1521
+ logger = new ConsoleLogger(level);
1522
+ }
1523
+ Base2.defaultLogger = logger;
1524
+ return logger;
1525
+ }, "initLogger");
1526
+
1527
+ // src/optionsFromZodSchema.ts
1528
+ import { ZodBoolean, ZodDefault, ZodEnum, ZodNumber, ZodObject, ZodOptional } from "zod";
1529
+ var collectOptions = /* @__PURE__ */ __name((zodType, path = [], out = {}) => {
1530
+ if (zodType instanceof ZodObject) {
1531
+ const shape = zodType.shape;
1532
+ for (const [k, v] of Object.entries(shape)) {
1533
+ collectOptions(v, [
1534
+ ...path,
1535
+ k
1536
+ ], out);
1537
+ }
1538
+ return out;
1539
+ }
1540
+ const def = zodType._def;
1541
+ if (def?.innerType instanceof ZodObject) {
1542
+ const shape = def.innerType.shape;
1543
+ for (const [k, v] of Object.entries(shape)) {
1544
+ collectOptions(v, [
1545
+ ...path,
1546
+ k
1547
+ ], out);
1548
+ }
1549
+ return out;
1550
+ }
1551
+ const options = {};
1552
+ options.describe = def.description;
1553
+ options.default = typeof def.defaultValue === "function" ? def.defaultValue() : def.defaultValue;
1554
+ let type = "string";
1555
+ const typeName = def.typeName === ZodDefault.name || def.typeName === ZodOptional.name ? def.innerType._def.typeName : def.typeName;
1556
+ if (typeName === ZodBoolean.name) type = "boolean";
1557
+ if (typeName === ZodNumber.name || def.coerce) type = "number";
1558
+ if (typeName === ZodEnum.name) {
1559
+ options.choices = Object.values(def.innerType.enum);
1560
+ }
1561
+ options.type = type;
1562
+ const key = path.join(".");
1563
+ out[key] = options;
1564
+ return out;
1565
+ }, "collectOptions");
1566
+ var optionsFromZodSchema = /* @__PURE__ */ __name((schema) => {
1567
+ const opts = {};
1568
+ for (const [rootKey, zodType] of Object.entries(schema)) {
1569
+ collectOptions(zodType, [
1570
+ rootKey
1571
+ ], opts);
1572
+ }
1573
+ return opts;
1574
+ }, "optionsFromZodSchema");
1575
+
1576
+ // src/waitForHostPort.ts
1577
+ import net from "net";
1578
+ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
1579
+ return new Promise((resolve) => {
1580
+ const tryConnect = /* @__PURE__ */ __name(() => {
1581
+ const socket = new net.Socket();
1582
+ socket.setTimeout(1e3).once("error", () => {
1583
+ socket.destroy();
1584
+ setTimeout(tryConnect, 500);
1585
+ }).once("timeout", () => {
1586
+ socket.destroy();
1587
+ setTimeout(tryConnect, 500);
1588
+ }).connect(port, host, () => {
1589
+ socket.end();
1590
+ resolve();
1591
+ });
1592
+ }, "tryConnect");
1593
+ tryConnect();
1594
+ });
1595
+ }, "waitForHostPort");
1596
+
1597
+ // src/runCLI.ts
1598
+ var config;
1599
+ var version = isDefined12("1.7.3") ? "1.7.3" : "unknown";
1600
+ var getContextFromConfig = /* @__PURE__ */ __name((config3) => {
1601
+ const logger = initLogger(config3);
1602
+ const orchestrator = new Orchestrator(logger);
1603
+ process.on("SIGINT", () => {
1604
+ void (async () => {
1605
+ try {
1606
+ logger.log("\nSIGINT received. Attempting graceful shutdown...");
1607
+ await orchestrator?.stop();
1608
+ logger.log("Orchestrator stopped, exiting now.");
1609
+ process.exit(0);
1610
+ } catch (err) {
1611
+ logger.error("Error stopping orchestrator:", err);
1612
+ process.exit(1);
1613
+ }
1614
+ })();
1615
+ });
1616
+ return {
1617
+ logger,
1618
+ orchestrator
1619
+ };
1620
+ }, "getContextFromConfig");
1621
+ async function runCLI() {
1622
+ const y = yargs(hideBin(process.argv));
1623
+ const argv = y.usage(`
1624
+ \u{1F680} XL1 Node CLI (${version})
1625
+ ${XL1LogoColorizedAscii}
1626
+ Run various components of the XL1 ecosystem.
1627
+
1628
+ Usage:
1629
+ $0 <command> [options]`).parserConfiguration({
1630
+ "dot-notation": true
1631
+ }).env("XL1").scriptName("xl1").config().version(version).middleware((argv2) => {
1632
+ try {
1633
+ config = ConfigSchema.parse(argv2);
1634
+ } catch (err) {
1635
+ if (err instanceof ZodError) {
1636
+ for (const issue of err.errors) {
1637
+ console.error(`${issue.path.join(".")} \u2192 ${issue.message}`);
1638
+ }
1639
+ }
1640
+ throw new Error("Invalid configuration");
1641
+ }
1642
+ }).options(optionsFromZodSchema(ConfigSchema.shape)).wrap(y.terminalWidth()).command("api", "Run a XL1 API Node", (yargs2) => {
1643
+ return yargs2.command("$0", "Run a XL1 API Node", () => {
1644
+ }, () => {
1645
+ const context = getContextFromConfig(config);
1646
+ runApi({
1647
+ ...context,
1648
+ config
1649
+ });
1650
+ });
1651
+ }).command("producer", "Run a XL1 Producer Node", (yargs2) => {
1652
+ return yargs2.command("$0", "Run a XL1 Producer Node", () => {
1653
+ }, async () => {
1654
+ const context = getContextFromConfig(config);
1655
+ await runProducer({
1656
+ ...context,
1657
+ config
1658
+ });
1659
+ });
1660
+ }).command("$0", "Run a full XL1 Node", () => {
1661
+ }, async () => {
1662
+ const context = getContextFromConfig(config);
1663
+ runApi({
1664
+ ...context,
1665
+ config
1666
+ });
1667
+ await waitForHostPort("localhost", config.api.port);
1668
+ await runProducer({
1669
+ ...context,
1670
+ config
1671
+ });
1672
+ }).help().alias("help", "h").argv;
1673
+ await argv;
1674
+ }
1675
+ __name(runCLI, "runCLI");
1676
+
1677
+ // src/start.ts
1678
+ import { config as config2 } from "dotenv";
1679
+ var start = /* @__PURE__ */ __name(async () => {
1680
+ config2({
1681
+ quiet: true
1682
+ });
1683
+ await runCLI();
1684
+ }, "start");
1685
+ export {
1686
+ Actor,
1687
+ BalanceActor,
1688
+ ChainHeadUpdateActor,
1689
+ LoggerStatusReporter,
1690
+ Orchestrator,
1691
+ ProducerActor,
1692
+ RuntimeStatusMonitor,
1693
+ ValidatorActor,
1694
+ canUseEvmProvider,
1695
+ initAccount,
1696
+ initBalanceService,
1697
+ initBlockProducer,
1698
+ initBlockRewardService,
1699
+ initChainIterator,
1700
+ initChainService,
1701
+ initElectionService,
1702
+ initEvmProvider,
1703
+ initHead,
1704
+ initHealthEndpoints,
1705
+ initPendingTransactions,
1706
+ initServices,
1707
+ initStakeIntentService,
1708
+ initValidator,
1709
+ runCLI,
1710
+ start
1711
+ };
1712
+ //# sourceMappingURL=index.mjs.map