@xyo-network/xl1-protocol-sdk 1.18.0 → 1.18.2

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 (219) hide show
  1. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts +52 -21
  2. package/dist/neutral/CreatableProvider/AbstractCreatableProvider.d.ts.map +1 -1
  3. package/dist/neutral/CreatableProvider/CreatableProvider.d.ts +13 -8
  4. package/dist/neutral/CreatableProvider/CreatableProvider.d.ts.map +1 -1
  5. package/dist/neutral/CreatableProvider/CreatableProviderRegistry.d.ts +2 -4
  6. package/dist/neutral/CreatableProvider/CreatableProviderRegistry.d.ts.map +1 -1
  7. package/dist/neutral/CreatableProvider/ProviderFactory.d.ts +6 -4
  8. package/dist/neutral/CreatableProvider/ProviderFactory.d.ts.map +1 -1
  9. package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts +7 -7
  10. package/dist/neutral/CreatableProvider/ProviderFactoryLocator.d.ts.map +1 -1
  11. package/dist/neutral/CreatableProvider/ProviderFactoryLocatorInstance.d.ts +3 -2
  12. package/dist/neutral/CreatableProvider/ProviderFactoryLocatorInstance.d.ts.map +1 -1
  13. package/dist/neutral/actor/Actor.d.ts +176 -0
  14. package/dist/neutral/actor/Actor.d.ts.map +1 -0
  15. package/dist/neutral/actor/index.d.ts +2 -0
  16. package/dist/neutral/actor/index.d.ts.map +1 -0
  17. package/dist/neutral/block/hydrate/allHashesPresent.d.ts +2 -2
  18. package/dist/neutral/block/hydrate/allHashesPresent.d.ts.map +1 -1
  19. package/dist/neutral/block/hydrate/hydrateBlock.d.ts +2 -2
  20. package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
  21. package/dist/neutral/config/Api.d.ts +1 -1
  22. package/dist/neutral/config/Api.d.ts.map +1 -1
  23. package/dist/neutral/config/Bridge.d.ts +41 -21
  24. package/dist/neutral/config/Bridge.d.ts.map +1 -1
  25. package/dist/neutral/config/Chain.d.ts +7 -3
  26. package/dist/neutral/config/Chain.d.ts.map +1 -1
  27. package/dist/neutral/config/Config.d.ts +48 -20
  28. package/dist/neutral/config/Config.d.ts.map +1 -1
  29. package/dist/neutral/config/Evm.d.ts +1 -1
  30. package/dist/neutral/config/Evm.d.ts.map +1 -1
  31. package/dist/neutral/config/Log.d.ts +2 -2
  32. package/dist/neutral/config/Log.d.ts.map +1 -1
  33. package/dist/neutral/config/Mempool.d.ts +1 -1
  34. package/dist/neutral/config/Mempool.d.ts.map +1 -1
  35. package/dist/neutral/config/Producer.d.ts +6 -2
  36. package/dist/neutral/config/Producer.d.ts.map +1 -1
  37. package/dist/neutral/config/RewardRedemptionApi.d.ts +1 -1
  38. package/dist/neutral/config/RewardRedemptionApi.d.ts.map +1 -1
  39. package/dist/neutral/config/Services.d.ts +1 -1
  40. package/dist/neutral/config/Services.d.ts.map +1 -1
  41. package/dist/neutral/config/Telemetry.d.ts +11 -4
  42. package/dist/neutral/config/Telemetry.d.ts.map +1 -1
  43. package/dist/neutral/config/UsageMeta.d.ts +1 -1
  44. package/dist/neutral/config/UsageMeta.d.ts.map +1 -1
  45. package/dist/neutral/config/Validation.d.ts +11 -3
  46. package/dist/neutral/config/Validation.d.ts.map +1 -1
  47. package/dist/neutral/config/index.d.ts +1 -0
  48. package/dist/neutral/config/index.d.ts.map +1 -1
  49. package/dist/neutral/config/storage/Storage.d.ts +1 -1
  50. package/dist/neutral/config/storage/Storage.d.ts.map +1 -1
  51. package/dist/neutral/config/storage/driver/Mongo.d.ts +1 -1
  52. package/dist/neutral/config/storage/driver/Mongo.d.ts.map +1 -1
  53. package/dist/neutral/eip-712/Payloads/EIP712Data.d.ts +4 -4
  54. package/dist/neutral/eip-712/Payloads/EIP712Data.d.ts.map +1 -1
  55. package/dist/neutral/eip-712/Payloads/EIP712Signature.d.ts +3 -3
  56. package/dist/neutral/eip-712/Payloads/EIP712Signature.d.ts.map +1 -1
  57. package/dist/neutral/eip-712/Types.d.ts +4 -4
  58. package/dist/neutral/eip-712/Types.d.ts.map +1 -1
  59. package/dist/neutral/index.d.ts +1 -0
  60. package/dist/neutral/index.d.ts.map +1 -1
  61. package/dist/neutral/index.mjs +3271 -3246
  62. package/dist/neutral/index.mjs.map +1 -1
  63. package/dist/neutral/model/ChainQualification.d.ts +15 -15
  64. package/dist/neutral/model/ChainQualification.d.ts.map +1 -1
  65. package/dist/neutral/payloads/netBalancesForPayloads.d.ts +5 -2
  66. package/dist/neutral/payloads/netBalancesForPayloads.d.ts.map +1 -1
  67. package/dist/neutral/payloads/netSchemasForPayloads.d.ts +5 -2
  68. package/dist/neutral/payloads/netSchemasForPayloads.d.ts.map +1 -1
  69. package/dist/neutral/primitives/chain/getWindowedChain.d.ts +8 -23
  70. package/dist/neutral/primitives/chain/getWindowedChain.d.ts.map +1 -1
  71. package/dist/neutral/primitives/rewards/networkStakeStepRewardPositionWeight.d.ts.map +1 -1
  72. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts +2 -1
  73. package/dist/neutral/primitives/stake/weightedStakeForRangeByPosition.d.ts.map +1 -1
  74. package/dist/neutral/primitives/uncle/findBestUncle.d.ts +21 -13
  75. package/dist/neutral/primitives/uncle/findBestUncle.d.ts.map +1 -1
  76. package/dist/neutral/primitives/uncle/findUncles.d.ts +21 -14
  77. package/dist/neutral/primitives/uncle/findUncles.d.ts.map +1 -1
  78. package/dist/neutral/provider/signer/XyoSigner.d.ts +2 -0
  79. package/dist/neutral/provider/signer/XyoSigner.d.ts.map +1 -1
  80. package/dist/neutral/runners/Finalization.d.ts +12 -0
  81. package/dist/neutral/runners/Finalization.d.ts.map +1 -0
  82. package/dist/neutral/runners/index.d.ts +1 -0
  83. package/dist/neutral/runners/index.d.ts.map +1 -1
  84. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +66 -33
  85. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -1
  86. package/dist/neutral/simple/block/SimpleBlockViewer.d.ts +9 -25
  87. package/dist/neutral/simple/block/SimpleBlockViewer.d.ts.map +1 -1
  88. package/dist/neutral/simple/blockReward/SimpleBlockRewardViewer.d.ts +1 -0
  89. package/dist/neutral/simple/blockReward/SimpleBlockRewardViewer.d.ts.map +1 -1
  90. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts +4 -3
  91. package/dist/neutral/simple/blockValidation/SimpleBlockValidationViewer.d.ts.map +1 -1
  92. package/dist/neutral/simple/chainStake/SimpleStakeViewer.d.ts +1 -0
  93. package/dist/neutral/simple/chainStake/SimpleStakeViewer.d.ts.map +1 -1
  94. package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts +1 -0
  95. package/dist/neutral/simple/datalake/SimpleDataLakeRunner.d.ts.map +1 -1
  96. package/dist/neutral/simple/datalake/SimpleDataLakeViewer.d.ts +1 -0
  97. package/dist/neutral/simple/datalake/SimpleDataLakeViewer.d.ts.map +1 -1
  98. package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts +21 -0
  99. package/dist/neutral/simple/finalization/SimpleFinalizationRunner.d.ts.map +1 -0
  100. package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts +61 -0
  101. package/dist/neutral/simple/finalization/SimpleFinalizationViewer.d.ts.map +1 -0
  102. package/dist/neutral/simple/finalization/index.d.ts +3 -0
  103. package/dist/neutral/simple/finalization/index.d.ts.map +1 -0
  104. package/dist/neutral/simple/index.d.ts +2 -0
  105. package/dist/neutral/simple/index.d.ts.map +1 -1
  106. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts +2 -0
  107. package/dist/neutral/simple/mempool/SimpleMempoolRunner.d.ts.map +1 -1
  108. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts +7 -2
  109. package/dist/neutral/simple/mempool/SimpleMempoolViewer.d.ts.map +1 -1
  110. package/dist/neutral/simple/runner/SimpleXyoRunner.d.ts +1 -0
  111. package/dist/neutral/simple/runner/SimpleXyoRunner.d.ts.map +1 -1
  112. package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts +19 -3
  113. package/dist/neutral/simple/signer/SimpleXyoSigner.d.ts.map +1 -1
  114. package/dist/neutral/simple/stakeEvents/SimpleStakeEventsViewer.d.ts +1 -0
  115. package/dist/neutral/simple/stakeEvents/SimpleStakeEventsViewer.d.ts.map +1 -1
  116. package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts +2 -1
  117. package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts.map +1 -1
  118. package/dist/neutral/simple/windowedBlock/SimpleWindowedBlockViewer.d.ts +191 -0
  119. package/dist/neutral/simple/windowedBlock/SimpleWindowedBlockViewer.d.ts.map +1 -0
  120. package/dist/neutral/simple/windowedBlock/index.d.ts +2 -0
  121. package/dist/neutral/simple/windowedBlock/index.d.ts.map +1 -0
  122. package/dist/neutral/summary/model/summary.d.ts +3 -1
  123. package/dist/neutral/summary/model/summary.d.ts.map +1 -1
  124. package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts +1 -1
  125. package/dist/neutral/summary/primitives/transfers/transfersSummary.d.ts.map +1 -1
  126. package/dist/neutral/transaction/TransactionBuilder.d.ts +56 -33
  127. package/dist/neutral/transaction/TransactionBuilder.d.ts.map +1 -1
  128. package/dist/neutral/transaction/signTransaction.d.ts +24 -12
  129. package/dist/neutral/transaction/signTransaction.d.ts.map +1 -1
  130. package/dist/neutral/utils/isZodError.d.ts +1 -1
  131. package/dist/neutral/utils/isZodError.d.ts.map +1 -1
  132. package/dist/neutral/validation/schema/Mnemonic.d.ts +1 -1
  133. package/dist/neutral/validation/schema/Mnemonic.d.ts.map +1 -1
  134. package/dist/neutral/viewers/AccountBalance.d.ts +70 -42
  135. package/dist/neutral/viewers/AccountBalance.d.ts.map +1 -1
  136. package/dist/neutral/viewers/Block.d.ts +2 -2
  137. package/dist/neutral/viewers/Block.d.ts.map +1 -1
  138. package/dist/neutral/viewers/BlockValidation.d.ts +10 -10
  139. package/dist/neutral/viewers/BlockValidation.d.ts.map +1 -1
  140. package/dist/neutral/viewers/Finalization.d.ts +14 -0
  141. package/dist/neutral/viewers/Finalization.d.ts.map +1 -0
  142. package/dist/neutral/viewers/Mempool.d.ts +5 -5
  143. package/dist/neutral/viewers/Mempool.d.ts.map +1 -1
  144. package/dist/neutral/viewers/TransactionValidation.d.ts +8 -8
  145. package/dist/neutral/viewers/TransactionValidation.d.ts.map +1 -1
  146. package/dist/neutral/viewers/WindowedBlock.d.ts +14 -0
  147. package/dist/neutral/viewers/WindowedBlock.d.ts.map +1 -0
  148. package/dist/neutral/viewers/index.d.ts +2 -0
  149. package/dist/neutral/viewers/index.d.ts.map +1 -1
  150. package/package.json +24 -22
  151. package/src/CreatableProvider/AbstractCreatableProvider.ts +12 -6
  152. package/src/CreatableProvider/CreatableProvider.ts +21 -9
  153. package/src/CreatableProvider/CreatableProviderRegistry.ts +3 -3
  154. package/src/CreatableProvider/ProviderFactory.ts +18 -10
  155. package/src/CreatableProvider/ProviderFactoryLocator.ts +6 -5
  156. package/src/CreatableProvider/ProviderFactoryLocatorInstance.ts +6 -2
  157. package/src/actor/Actor.ts +209 -0
  158. package/src/actor/index.ts +1 -0
  159. package/src/block/hydrate/allHashesPresent.ts +2 -2
  160. package/src/block/hydrate/hydrateBlock.ts +2 -2
  161. package/src/config/Api.ts +1 -2
  162. package/src/config/Bridge.ts +1 -2
  163. package/src/config/Chain.ts +1 -2
  164. package/src/config/Config.ts +1 -1
  165. package/src/config/Evm.ts +1 -2
  166. package/src/config/Log.ts +1 -2
  167. package/src/config/Mempool.ts +1 -2
  168. package/src/config/Producer.ts +1 -2
  169. package/src/config/RewardRedemptionApi.ts +1 -2
  170. package/src/config/Services.ts +1 -2
  171. package/src/config/Telemetry.ts +10 -4
  172. package/src/config/UsageMeta.ts +1 -1
  173. package/src/config/Validation.ts +1 -2
  174. package/src/config/index.ts +1 -0
  175. package/src/config/storage/Storage.ts +1 -2
  176. package/src/config/storage/driver/Mongo.ts +1 -2
  177. package/src/eip-712/Payloads/EIP712Data.ts +1 -1
  178. package/src/eip-712/Payloads/EIP712Signature.ts +1 -1
  179. package/src/eip-712/Types.ts +1 -1
  180. package/src/index.ts +1 -0
  181. package/src/model/ChainQualification.ts +1 -1
  182. package/src/primitives/chain/getWindowedChain.ts +33 -14
  183. package/src/primitives/rewards/networkStakeStepRewardPositionWeight.ts +3 -2
  184. package/src/primitives/stake/allStakersForStep.ts +1 -1
  185. package/src/primitives/stake/weightedStakeForRangeByPosition.ts +10 -2
  186. package/src/provider/signer/XyoSigner.ts +3 -0
  187. package/src/runners/Finalization.ts +15 -0
  188. package/src/runners/index.ts +1 -0
  189. package/src/simple/accountBalance/SimpleAccountBalanceViewer.ts +1 -0
  190. package/src/simple/block/SimpleBlockViewer.ts +23 -37
  191. package/src/simple/blockReward/SimpleBlockRewardViewer.ts +1 -0
  192. package/src/simple/blockValidation/SimpleBlockValidationViewer.ts +16 -13
  193. package/src/simple/chainStake/SimpleStakeViewer.ts +1 -0
  194. package/src/simple/datalake/SimpleDataLakeRunner.ts +1 -0
  195. package/src/simple/datalake/SimpleDataLakeViewer.ts +1 -0
  196. package/src/simple/finalization/SimpleFinalizationRunner.ts +45 -0
  197. package/src/simple/finalization/SimpleFinalizationViewer.ts +101 -0
  198. package/src/simple/finalization/index.ts +2 -0
  199. package/src/simple/index.ts +2 -0
  200. package/src/simple/mempool/SimpleMempoolRunner.ts +11 -1
  201. package/src/simple/mempool/SimpleMempoolViewer.ts +41 -8
  202. package/src/simple/runner/SimpleXyoRunner.ts +3 -1
  203. package/src/simple/signer/SimpleXyoSigner.ts +26 -5
  204. package/src/simple/stakeEvents/SimpleStakeEventsViewer.ts +1 -0
  205. package/src/simple/timesync/SimpleTimeSyncViewer.ts +3 -1
  206. package/src/simple/windowedBlock/SimpleWindowedBlockViewer.ts +208 -0
  207. package/src/simple/windowedBlock/index.ts +1 -0
  208. package/src/summary/model/summary.ts +3 -3
  209. package/src/summary/primitives/transfers/transfersSummary.ts +1 -1
  210. package/src/utils/isZodError.ts +1 -1
  211. package/src/validation/schema/Mnemonic.ts +1 -1
  212. package/src/viewers/AccountBalance.ts +1 -1
  213. package/src/viewers/Block.ts +2 -2
  214. package/src/viewers/BlockValidation.ts +1 -1
  215. package/src/viewers/Finalization.ts +19 -0
  216. package/src/viewers/Mempool.ts +1 -1
  217. package/src/viewers/TransactionValidation.ts +1 -1
  218. package/src/viewers/WindowedBlock.ts +17 -0
  219. package/src/viewers/index.ts +2 -0
@@ -0,0 +1,101 @@
1
+ import {
2
+ assertEx,
3
+ Hash,
4
+ spanRootAsync,
5
+ } from '@xylabs/sdk-js'
6
+ import type { ReadArchivist } from '@xyo-network/archivist-model'
7
+ import {
8
+ asSignedHydratedBlockWithStorageMeta, type SignedBlockBoundWitnessWithHashMeta, type SignedHydratedBlockWithHashMeta,
9
+ SignedHydratedBlockWithStorageMeta,
10
+ XL1BlockNumber,
11
+ } from '@xyo-network/xl1-protocol'
12
+
13
+ import { hydrateBlock } from '../../block/index.ts'
14
+ import {
15
+ AbstractCreatableProvider, creatableProvider, CreatableProviderParams,
16
+ } from '../../CreatableProvider/index.ts'
17
+ import { ChainStoreRead } from '../../model/index.ts'
18
+ import { findMostRecentBlock, readPayloadMapFromStore } from '../../primitives/index.ts'
19
+ import { HydratedCache } from '../../utils/index.ts'
20
+ import {
21
+ type FinalizationViewer,
22
+ FinalizationViewerMoniker,
23
+ } from '../../viewers/index.ts'
24
+
25
+ export interface SimpleFinalizationViewerParams extends CreatableProviderParams {
26
+ finalizedArchivist: ReadArchivist
27
+ }
28
+
29
+ @creatableProvider()
30
+ export class SimpleFinalizationViewer extends AbstractCreatableProvider<SimpleFinalizationViewerParams> implements FinalizationViewer {
31
+ static readonly defaultMoniker = FinalizationViewerMoniker
32
+ static readonly dependencies = []
33
+ static readonly monikers = [FinalizationViewerMoniker]
34
+ moniker = SimpleFinalizationViewer.defaultMoniker
35
+
36
+ protected _store: ChainStoreRead | undefined
37
+
38
+ private _signedHydratedBlockCache: HydratedCache<SignedHydratedBlockWithStorageMeta> | undefined
39
+
40
+ protected get finalizedArchivist() {
41
+ return this.params.finalizedArchivist
42
+ }
43
+
44
+ protected get hydratedBlockCache(): HydratedCache<SignedHydratedBlockWithStorageMeta> {
45
+ if (this._signedHydratedBlockCache) return this._signedHydratedBlockCache
46
+ const chainMap = this.store.chainMap
47
+ this._signedHydratedBlockCache = new HydratedCache<SignedHydratedBlockWithStorageMeta>(chainMap, async (
48
+ store: ChainStoreRead,
49
+ hash: Hash,
50
+ maxDepth?: number,
51
+ minDepth?: number,
52
+ ) => {
53
+ const result = await hydrateBlock(store, hash, maxDepth, minDepth)
54
+ return asSignedHydratedBlockWithStorageMeta(result, true)
55
+ }, 200)
56
+ return this._signedHydratedBlockCache
57
+ }
58
+
59
+ protected get store() {
60
+ return this._store!
61
+ }
62
+
63
+ static override async paramsHandler(params: Partial<SimpleFinalizationViewerParams>) {
64
+ assertEx(params.finalizedArchivist, () => 'finalizedArchivist is required')
65
+ return { ...await super.paramsHandler(params) }
66
+ }
67
+
68
+ override async createHandler() {
69
+ await super.createHandler()
70
+ this._store = { chainMap: readPayloadMapFromStore(this.params.finalizedArchivist) }
71
+ }
72
+
73
+ async head(): Promise<SignedHydratedBlockWithHashMeta> {
74
+ return await spanRootAsync('head', async () => {
75
+ const currentHead = assertEx(await this.getCurrentHead(), () => 'Could not find most recent block [currentBlock]')
76
+ const cache = this.hydratedBlockCache
77
+ const block = await cache.get(currentHead._hash)
78
+ if (!block) {
79
+ console.log(`Could not find current block with hash ${currentHead!._hash}`)
80
+ }
81
+ return assertEx(block, () => 'Could not find current block')
82
+ }, this.tracer)
83
+ }
84
+
85
+ async headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta> {
86
+ return (await this.head())[0]
87
+ }
88
+
89
+ async headHash(): Promise<Hash> {
90
+ return (await this.headBlock())._hash
91
+ }
92
+
93
+ async headNumber(): Promise<XL1BlockNumber> {
94
+ return (await this.headBlock()).block
95
+ }
96
+
97
+ protected async getCurrentHead() {
98
+ const chainArchivist = this.finalizedArchivist
99
+ return await findMostRecentBlock(chainArchivist)
100
+ }
101
+ }
@@ -0,0 +1,2 @@
1
+ export * from './SimpleFinalizationRunner.ts'
2
+ export * from './SimpleFinalizationViewer.ts'
@@ -5,6 +5,7 @@ export * from './blockValidation/index.ts'
5
5
  export * from './chainStake/index.ts'
6
6
  export * from './client/index.ts'
7
7
  export * from './datalake/index.ts'
8
+ export * from './finalization/index.ts'
8
9
  export * from './gateway/index.ts'
9
10
  export * from './mempool/index.ts'
10
11
  export * from './network/index.ts'
@@ -13,3 +14,4 @@ export * from './runner/index.ts'
13
14
  export * from './signer/index.ts'
14
15
  export * from './stakeEvents/index.ts'
15
16
  export * from './timesync/index.ts'
17
+ export * from './windowedBlock/index.ts'
@@ -1,4 +1,4 @@
1
- import { type Hash } from '@xylabs/sdk-js'
1
+ import { assertEx, type Hash } from '@xylabs/sdk-js'
2
2
  import type { ArchivistInstance } from '@xyo-network/archivist-model'
3
3
  import { PayloadBuilder } from '@xyo-network/payload-builder'
4
4
  import { type SignedHydratedBlock, type SignedHydratedTransaction } from '@xyo-network/xl1-protocol'
@@ -8,6 +8,7 @@ import {
8
8
  } from '../../CreatableProvider/index.ts'
9
9
  import { hydratedBlockToPayloadBundle, hydratedTransactionToPayloadBundle } from '../../model/index.ts'
10
10
  import { type MempoolRunner, MempoolRunnerMoniker } from '../../runners/index.ts'
11
+ import { WindowedBlockViewerMoniker } from '../../viewers/index.ts'
11
12
 
12
13
  export interface SimpleMempoolRunnerParams extends CreatableProviderParams {
13
14
  pendingBlocksArchivist: ArchivistInstance
@@ -17,6 +18,7 @@ export interface SimpleMempoolRunnerParams extends CreatableProviderParams {
17
18
  @creatableProvider()
18
19
  export class SimpleMempoolRunner extends AbstractCreatableProvider<SimpleMempoolRunnerParams> implements MempoolRunner {
19
20
  static readonly defaultMoniker = MempoolRunnerMoniker
21
+ static readonly dependencies = [WindowedBlockViewerMoniker]
20
22
  static readonly monikers = [MempoolRunnerMoniker]
21
23
  moniker = SimpleMempoolRunner.defaultMoniker
22
24
 
@@ -28,6 +30,14 @@ export class SimpleMempoolRunner extends AbstractCreatableProvider<SimpleMempool
28
30
  return this.params.pendingTransactionsArchivist
29
31
  }
30
32
 
33
+ static override async paramsHandler(params?: Partial<SimpleMempoolRunnerParams>): Promise<SimpleMempoolRunnerParams> {
34
+ return {
35
+ ...await super.paramsHandler(params),
36
+ pendingBlocksArchivist: assertEx(params?.pendingBlocksArchivist, () => 'pendingBlocksArchivist is required'),
37
+ pendingTransactionsArchivist: assertEx(params?.pendingTransactionsArchivist, () => 'pendingTransactionsArchivist is required'),
38
+ }
39
+ }
40
+
31
41
  async submitBlocks(blocks: SignedHydratedBlock[]): Promise<Hash[]> {
32
42
  const bundles = await Promise.all(blocks.map(async ([bw, payloads]) => {
33
43
  return hydratedBlockToPayloadBundle([
@@ -1,19 +1,24 @@
1
1
  import {
2
- creatable,
3
2
  exists, isDefined, isHash,
4
3
  } from '@xylabs/sdk-js'
5
4
  import type { ArchivistInstance } from '@xyo-network/archivist-model'
6
5
  import {
7
6
  isHashMeta, isPayloadBundle, type Sequence,
8
7
  } from '@xyo-network/payload-model'
9
- import type { SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-protocol'
8
+ import type {
9
+ HydratedTransactionWithHashMeta, SignedHydratedBlockWithHashMeta, SignedHydratedTransactionWithHashMeta,
10
+ } from '@xyo-network/xl1-protocol'
10
11
 
11
- import { AbstractCreatableProvider, CreatableProviderParams } from '../../CreatableProvider/index.ts'
12
+ import {
13
+ AbstractCreatableProvider, creatableProvider, CreatableProviderParams,
14
+ } from '../../CreatableProvider/index.ts'
12
15
  import { bundledPayloadToHydratedBlock, bundledPayloadToHydratedTransaction } from '../../model/index.ts'
13
16
  import {
14
17
  type MempoolViewer,
15
18
  MempoolViewerMoniker,
16
19
  type PendingTransactionsOptions,
20
+ WindowedBlockViewer,
21
+ WindowedBlockViewerMoniker,
17
22
  } from '../../viewers/index.ts'
18
23
 
19
24
  export interface SimpleMempoolViewerParams extends CreatableProviderParams {
@@ -21,12 +26,15 @@ export interface SimpleMempoolViewerParams extends CreatableProviderParams {
21
26
  pendingTransactionsArchivist: ArchivistInstance
22
27
  }
23
28
 
24
- @creatable()
29
+ @creatableProvider()
25
30
  export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempoolViewerParams> implements MempoolViewer {
26
31
  static readonly defaultMoniker = MempoolViewerMoniker
32
+ static readonly dependencies = [WindowedBlockViewerMoniker]
27
33
  static readonly monikers = [MempoolViewerMoniker]
28
34
  moniker = SimpleMempoolViewer.defaultMoniker
29
35
 
36
+ private _windowedBlockViewer?: WindowedBlockViewer
37
+
30
38
  protected get pendingBlocksArchivist() {
31
39
  return this.params.pendingBlocksArchivist
32
40
  }
@@ -35,6 +43,15 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
35
43
  return this.params.pendingTransactionsArchivist
36
44
  }
37
45
 
46
+ protected get windowedBlockViewer() {
47
+ return this._windowedBlockViewer!
48
+ }
49
+
50
+ override async createHandler() {
51
+ await super.createHandler()
52
+ this._windowedBlockViewer = await this.locator.getInstance<WindowedBlockViewer>(WindowedBlockViewerMoniker)
53
+ }
54
+
38
55
  async pendingBlocks({ cursor: providedCursor }: PendingTransactionsOptions = {}): Promise<SignedHydratedBlockWithHashMeta[]> {
39
56
  let cursor: Sequence | undefined = undefined
40
57
  if (isHash(providedCursor)) {
@@ -44,13 +61,13 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
44
61
  }
45
62
  }
46
63
  const bundles = await this.pendingBlocksArchivist.next({
47
- order: 'asc', limit: 100, cursor,
64
+ order: 'desc', limit: 100, cursor,
48
65
  })
49
66
  const filteredBundles = bundles.filter(isPayloadBundle).filter(isHashMeta)
50
67
  return (await Promise.all(filteredBundles.map(async bundle => await bundledPayloadToHydratedBlock(bundle)))).filter(exists)
51
68
  }
52
69
 
53
- async pendingTransactions({ cursor: providedCursor }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithHashMeta[]> {
70
+ async pendingTransactions({ cursor: providedCursor, limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithHashMeta[]> {
54
71
  let cursor: Sequence | undefined = undefined
55
72
  if (isHash(providedCursor)) {
56
73
  const [p] = await this.pendingTransactionsArchivist.get([providedCursor])
@@ -60,13 +77,29 @@ export class SimpleMempoolViewer extends AbstractCreatableProvider<SimpleMempool
60
77
  }
61
78
  this.logger?.info(`Fetching pending transactions from cursor: ${cursor}`)
62
79
  const bundles = await this.pendingTransactionsArchivist.next({
63
- order: 'asc', limit: 100, cursor,
80
+ order: 'asc', limit, cursor,
64
81
  })
65
82
  this.logger?.info(`Fetched pending transactions: ${bundles.length} bundles`)
66
83
  const filteredBundles = bundles.filter(isPayloadBundle).filter(isHashMeta)
67
84
  this.logger?.info(`Filtered pending transactions: ${JSON.stringify(bundles, null, 2)} filteredBundles`)
68
85
  const result = (await Promise.all(filteredBundles.map(async bundle => await bundledPayloadToHydratedTransaction(bundle)))).filter(exists)
69
86
  this.logger?.info(`Converted pending transactions: ${JSON.stringify(result, null, 2)} results`)
70
- return result
87
+ return (await Promise.all(result.map(async (tx) => {
88
+ const purged = await this.purgeIfInvalid(tx)
89
+ if (purged) {
90
+ this.logger?.info(`Purged completed/invalid transaction: ${tx[0]._hash}`)
91
+ } else {
92
+ return tx
93
+ }
94
+ }))).filter(exists)
95
+ }
96
+
97
+ private async purgeIfInvalid(tx: HydratedTransactionWithHashMeta) {
98
+ const existingBlock = await this.windowedBlockViewer.blockByTransactionHash(tx[0]._hash)
99
+ if (existingBlock) {
100
+ await this.pendingTransactionsArchivist.delete([tx[0]._hash])
101
+ return true
102
+ }
103
+ return false
71
104
  }
72
105
  }
@@ -7,7 +7,7 @@ import { PayloadBuilder } from '@xyo-network/payload-builder'
7
7
  import type { SignedHydratedTransactionWithStorageMeta } from '@xyo-network/xl1-protocol'
8
8
 
9
9
  import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
10
- import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
10
+ import { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'
11
11
  import { hydratedTransactionToPayloadBundle } from '../../model/index.ts'
12
12
  import { type XyoRunner, XyoRunnerMoniker } from '../../provider/index.ts'
13
13
  import { type MempoolRunner, MempoolRunnerMoniker } from '../../runners/index.ts'
@@ -16,8 +16,10 @@ export interface SimpleXyoRunnerParams extends CreatableProviderParams {
16
16
  pendingTransactionsArchivist: ArchivistInstance
17
17
  }
18
18
 
19
+ @creatableProvider()
19
20
  export class SimpleXyoRunner extends AbstractCreatableProvider<SimpleXyoRunnerParams> implements XyoRunner {
20
21
  static readonly defaultMoniker = XyoRunnerMoniker
22
+ static readonly dependencies = [MempoolRunnerMoniker]
21
23
  static readonly monikers = [XyoRunnerMoniker]
22
24
  moniker = SimpleXyoRunner.defaultMoniker
23
25
 
@@ -1,4 +1,5 @@
1
1
  import type { Address, Promisable } from '@xylabs/sdk-js'
2
+ import { Account } from '@xyo-network/account'
2
3
  import type { AccountInstance } from '@xyo-network/account-model'
3
4
  import { PayloadBuilder } from '@xyo-network/payload-builder'
4
5
  import { type Payload } from '@xyo-network/payload-model'
@@ -10,14 +11,34 @@ import type {
10
11
  } from '@xyo-network/xl1-protocol'
11
12
  import { SignedHydratedTransactionWithHashMetaZod } from '@xyo-network/xl1-protocol'
12
13
 
13
- import type { XyoSigner } from '../../provider/index.ts'
14
+ import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
15
+ import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
16
+ import { type XyoSigner, XyoSignerMoniker } from '../../provider/index.ts'
14
17
  import { buildTransaction, signTransaction } from '../../transaction/index.ts'
15
18
 
16
- export class SimpleXyoSigner implements XyoSigner {
17
- protected readonly _account: AccountInstance
19
+ export interface SimpleXyoSignerParams extends CreatableProviderParams {
20
+ account: AccountInstance
21
+ }
22
+
23
+ export class SimpleXyoSigner extends AbstractCreatableProvider<SimpleXyoSignerParams> implements XyoSigner {
24
+ static readonly defaultMoniker = XyoSignerMoniker
25
+ static readonly monikers = [XyoSignerMoniker]
26
+ moniker = SimpleXyoSigner.defaultMoniker
27
+ protected readonly _account!: AccountInstance
28
+
29
+ static override async paramsHandler(params?: Partial<SimpleXyoSignerParams>) {
30
+ let account: AccountInstance
31
+ if (params?.account) {
32
+ account = params.account
33
+ } else {
34
+ const localLogger = params?.logger ?? params?.context?.logger
35
+ localLogger?.warn(`No account provided to SimpleXyoSigner, generating a random account.
36
+ This account will not be persisted and any transactions signed with it may be lost.
37
+ `)
18
38
 
19
- constructor(account: AccountInstance) {
20
- this._account = account
39
+ account = await Account.random()
40
+ }
41
+ return { ...await super.paramsHandler(params), account }
21
42
  }
22
43
 
23
44
  address(): Promisable<Address> {
@@ -16,6 +16,7 @@ export interface SimpleStakeEventsParams extends CreatableProviderParams {
16
16
  @creatableProvider()
17
17
  export class SimpleStakeEventsViewer extends AbstractCreatableProvider<SimpleStakeEventsParams> implements StakeEventsViewer {
18
18
  static readonly defaultMoniker = StakeEventsViewerMoniker
19
+ static readonly dependencies = []
19
20
  static readonly monikers = [StakeEventsViewerMoniker]
20
21
  moniker = SimpleStakeEventsViewer.defaultMoniker
21
22
 
@@ -9,7 +9,7 @@ import {
9
9
  import type { Provider } from 'ethers'
10
10
 
11
11
  import type { CreatableProviderParams } from '../../CreatableProvider/index.ts'
12
- import { AbstractCreatableProvider } from '../../CreatableProvider/index.ts'
12
+ import { AbstractCreatableProvider, creatableProvider } from '../../CreatableProvider/index.ts'
13
13
  import {
14
14
  type BlockViewer, BlockViewerMoniker, type TimeSyncViewer, TimeSyncViewerMoniker,
15
15
  } from '../../viewers/index.ts'
@@ -18,8 +18,10 @@ export interface SimpleTimeSyncViewerParams extends CreatableProviderParams {
18
18
  ethProvider?: Provider
19
19
  }
20
20
 
21
+ @creatableProvider()
21
22
  export class SimpleTimeSyncViewer extends AbstractCreatableProvider<SimpleTimeSyncViewerParams> implements TimeSyncViewer {
22
23
  static readonly defaultMoniker = TimeSyncViewerMoniker
24
+ static readonly dependencies = [BlockViewerMoniker]
23
25
  static readonly monikers = [TimeSyncViewerMoniker]
24
26
  moniker = SimpleTimeSyncViewer.defaultMoniker
25
27
 
@@ -0,0 +1,208 @@
1
+ import {
2
+ assertEx,
3
+ exists,
4
+ type Hash,
5
+ isNull,
6
+ type Promisable,
7
+ } from '@xylabs/sdk-js'
8
+ import type { Payload, WithHashMeta } from '@xyo-network/payload-model'
9
+ import type {
10
+ ChainId,
11
+ HydratedBlockWithHashMeta,
12
+ SignedHydratedBlockWithHashMeta, XL1BlockNumber,
13
+ } from '@xyo-network/xl1-protocol'
14
+ import { asXL1BlockNumber } from '@xyo-network/xl1-protocol'
15
+ import { Mutex } from 'async-mutex'
16
+
17
+ import { transactionsFromHydratedBlock } from '../../block/index.ts'
18
+ import {
19
+ AbstractCreatableProvider, creatableProvider, type CreatableProviderParams,
20
+ } from '../../CreatableProvider/index.ts'
21
+ import { MemoryMap } from '../../driver/index.ts'
22
+ import type { SyncMap } from '../../map/index.ts'
23
+ import type {
24
+ BlockViewer,
25
+ WindowedBlockViewer,
26
+ } from '../../viewers/index.ts'
27
+ import {
28
+ BlockViewerMoniker,
29
+ WindowedBlockViewerMoniker,
30
+ } from '../../viewers/index.ts'
31
+
32
+ export interface SimpleWindowedBlockViewerParams extends CreatableProviderParams {
33
+ blockViewer?: BlockViewer
34
+ maxWindowSize: number
35
+ syncInterval: number
36
+ }
37
+
38
+ @creatableProvider()
39
+ export class SimpleWindowedBlockViewer extends AbstractCreatableProvider<SimpleWindowedBlockViewerParams> implements WindowedBlockViewer {
40
+ static readonly defaultMoniker = WindowedBlockViewerMoniker
41
+ static readonly dependencies = [BlockViewerMoniker]
42
+ static readonly monikers = [WindowedBlockViewerMoniker]
43
+ moniker = WindowedBlockViewerMoniker
44
+
45
+ private _blockHashMap!: SyncMap<Hash, SignedHydratedBlockWithHashMeta>
46
+ private _blockNumberMap!: SyncMap<XL1BlockNumber, SignedHydratedBlockWithHashMeta>
47
+ // the external BlockViewer
48
+ private _blockViewer!: BlockViewer
49
+ private _chain: SignedHydratedBlockWithHashMeta[] = []
50
+ private _syncMutex = new Mutex()
51
+ private _timerId: ReturnType<typeof setInterval> | null = null
52
+ private _transactionHashMap!: SyncMap<Hash, SignedHydratedBlockWithHashMeta>
53
+
54
+ protected get maxWindowSize() {
55
+ return this.params.maxWindowSize
56
+ }
57
+
58
+ protected get syncInterval() {
59
+ return this.params.syncInterval
60
+ }
61
+
62
+ static override async paramsHandler(params?: Partial<SimpleWindowedBlockViewerParams>): Promise<SimpleWindowedBlockViewerParams> {
63
+ return {
64
+ ...await super.paramsHandler(params),
65
+ maxWindowSize: params?.maxWindowSize ?? 1000,
66
+ syncInterval: params?.syncInterval ?? 10_000,
67
+ }
68
+ }
69
+
70
+ blockByHash(hash: Hash) {
71
+ return this._blockHashMap.get(hash) ?? null
72
+ }
73
+
74
+ blockByNumber(blockNumber: XL1BlockNumber) {
75
+ return this._blockNumberMap.get(blockNumber) ?? null
76
+ }
77
+
78
+ async blockByTransactionHash(hash: Hash) {
79
+ const [block = null] = await this.blocksByTransactionHashes([hash])
80
+ return block
81
+ }
82
+
83
+ blocksByHash(hash: Hash, limit?: number) {
84
+ const result: SignedHydratedBlockWithHashMeta[] = []
85
+ let block = this._blockHashMap.get(hash)
86
+ while (block && (limit === undefined || result.length < limit)) {
87
+ result.unshift(block)
88
+ const previousHash = block[0].previous
89
+ block = previousHash ? this._blockHashMap.get(previousHash) : undefined
90
+ }
91
+ return result
92
+ }
93
+
94
+ blocksByNumber(blockNumber: XL1BlockNumber, limit?: number) {
95
+ const result: SignedHydratedBlockWithHashMeta[] = []
96
+ let block = this._blockNumberMap.get(blockNumber)
97
+ while (block && (limit === undefined || result.length < limit)) {
98
+ result.unshift(block)
99
+ const previousBlockNumber = asXL1BlockNumber(block[0].block - 1, true)
100
+ block = (previousBlockNumber >= 0) ? this._blockNumberMap.get(previousBlockNumber) : undefined
101
+ }
102
+ return result
103
+ }
104
+
105
+ blocksByTransactionHashes(hashes: Hash[]): Promisable<HydratedBlockWithHashMeta[]> {
106
+ return hashes.map(hash => this._transactionHashMap.get(hash)).filter(exists)
107
+ }
108
+
109
+ chainId(_blockNumber?: unknown): Promisable<ChainId> {
110
+ throw new Error('Method not implemented.')
111
+ }
112
+
113
+ override async createHandler() {
114
+ await super.createHandler()
115
+
116
+ this._blockViewer = assertEx(
117
+ this.params.blockViewer ?? await this.locator.getInstance<BlockViewer>(BlockViewerMoniker),
118
+ () => 'BlockViewer instance is required',
119
+ )
120
+ this._blockHashMap = new MemoryMap<Hash, SignedHydratedBlockWithHashMeta>()
121
+ this._blockNumberMap = new MemoryMap<XL1BlockNumber, SignedHydratedBlockWithHashMeta>()
122
+ this._transactionHashMap = new MemoryMap<Hash, SignedHydratedBlockWithHashMeta>()
123
+ }
124
+
125
+ currentBlock(): Promisable<SignedHydratedBlockWithHashMeta> {
126
+ return assertEx(this._chain.at(-1))
127
+ }
128
+
129
+ currentBlockHash(): Promisable<Hash> {
130
+ return assertEx(this._chain.at(-1)?.[0]._hash)
131
+ }
132
+
133
+ currentBlockNumber(): Promisable<XL1BlockNumber> {
134
+ return assertEx(this._chain.at(-1)?.[0].block)
135
+ }
136
+
137
+ payloadByHash(_hash: Hash): Promisable<WithHashMeta<Payload> | null> {
138
+ throw new Error('Method not implemented.')
139
+ }
140
+
141
+ payloadsByHash(_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {
142
+ throw new Error('Method not implemented.')
143
+ }
144
+
145
+ override async startHandler() {
146
+ await super.startHandler()
147
+ await this.sync()
148
+ this.stopPoll()
149
+ this.startPoll()
150
+ }
151
+
152
+ override async stopHandler() {
153
+ await super.stopHandler()
154
+ this.stopPoll()
155
+ }
156
+
157
+ private addBlock(block: SignedHydratedBlockWithHashMeta) {
158
+ const removedBlock = this._chain.shift()
159
+ if (removedBlock) {
160
+ this._blockHashMap.delete(removedBlock[0]._hash)
161
+ this._blockNumberMap.delete(removedBlock[0].block)
162
+ for (const tx of transactionsFromHydratedBlock(removedBlock)) {
163
+ this._transactionHashMap.delete(tx._hash)
164
+ }
165
+ }
166
+ this._chain.push(block)
167
+ this._blockHashMap.set(block[0]._hash, block)
168
+ for (const tx of transactionsFromHydratedBlock(block)) {
169
+ this._transactionHashMap.set(tx._hash, block)
170
+ }
171
+ }
172
+
173
+ private startPoll() {
174
+ this._timerId = setInterval(() => {
175
+ void this.sync()
176
+ }, this.syncInterval)
177
+ }
178
+
179
+ private stopPoll() {
180
+ if (this._timerId) {
181
+ clearInterval(this._timerId)
182
+ }
183
+ this._timerId = null
184
+ }
185
+
186
+ private async sync() {
187
+ if (this._syncMutex.isLocked()) {
188
+ return
189
+ }
190
+ return await this._syncMutex.runExclusive(async () => {
191
+ try {
192
+ let cursor: SignedHydratedBlockWithHashMeta | null = await this._blockViewer.currentBlock()
193
+ const previousHead = this._chain.length > 0 ? await this.currentBlockHash() : null
194
+ const newBlocks: SignedHydratedBlockWithHashMeta[] = []
195
+ while (!isNull(cursor) && cursor[0]._hash !== previousHead && newBlocks.length < this.maxWindowSize) {
196
+ newBlocks.unshift(cursor)
197
+ const previousHash = newBlocks[0][0].previous
198
+ cursor = isNull(previousHash) ? null : await this._blockViewer.blockByHash(previousHash)
199
+ }
200
+ for (const block of newBlocks) {
201
+ this.addBlock(block)
202
+ }
203
+ } catch (ex) {
204
+ console.error('Error during sync:', ex)
205
+ }
206
+ })
207
+ }
208
+ }
@@ -0,0 +1 @@
1
+ export * from './SimpleWindowedBlockViewer.ts'
@@ -5,9 +5,9 @@ import type { MapType, MapTypeRead } from '../../map/index.ts'
5
5
  import type {
6
6
  BaseContext, ChainContext, ChainContextRead,
7
7
  } from '../../model/index.ts'
8
- import type {
9
- BalancesStepSummary, SchemasStepSummary, TransfersStepSummary,
10
- } from './index.ts'
8
+ import type { BalancesStepSummary } from './BalancesStepSummary.ts'
9
+ import type { SchemasStepSummary } from './SchemasStepSummary.ts'
10
+ import type { TransfersStepSummary } from './TransfersSummary.ts'
11
11
 
12
12
  export interface ChainSummaryContextBase<TPayload extends Payload,
13
13
  T extends (MapTypeRead<string, TPayload>)> extends BaseContext {
@@ -6,7 +6,7 @@ import { deepCalculateFramesFromRange } from '../../../block/index.ts'
6
6
  import type { ChainQualified, ChainQualifiedConfig } from '../../../model/index.ts'
7
7
  import { isChainQualifiedHeadConfig, isChainQualifiedRangeConfig } from '../../../model/index.ts'
8
8
  import { parseSignedBigInt } from '../../../SignedBigInt.ts'
9
- import type { TransfersStepSummaryContext } from '../../index.ts'
9
+ import type { TransfersStepSummaryContext } from '../../model/index.ts'
10
10
  import { transfersStepSummaryFromRange } from './transfersStepSummaryFromRange.ts'
11
11
 
12
12
  // the summary of amount of rewards claimed from the step reward pool by addresses
@@ -1,4 +1,4 @@
1
- import * as z from 'zod'
1
+ import { z } from 'zod'
2
2
 
3
3
  export const isZodError = (error: unknown): error is z.ZodError => {
4
4
  return error instanceof z.ZodError
@@ -1,4 +1,4 @@
1
- import * as z from 'zod'
1
+ import { z } from 'zod'
2
2
 
3
3
  /**
4
4
  * Validates a single string containing a BIP-39 mnemonic.
@@ -6,7 +6,7 @@ import {
6
6
  TransferZod,
7
7
  } from '@xyo-network/xl1-protocol'
8
8
  import { BlockBoundWitnessZod, TransactionBoundWitnessZod } from '@xyo-network/xl1-protocol'
9
- import z from 'zod'
9
+ import { z } from 'zod'
10
10
 
11
11
  import {
12
12
  ChainQualificationZod,
@@ -4,7 +4,7 @@ import type {
4
4
  ChainId, SignedHydratedBlockWithHashMeta, XL1BlockNumber,
5
5
  } from '@xyo-network/xl1-protocol'
6
6
 
7
- import type { Provider } from '../model/index.ts'
7
+ import type { Provider, ProviderMoniker } from '../model/index.ts'
8
8
 
9
9
  export interface BlockViewerMethods {
10
10
  blocksByHash(hash: Hash, limit?: number): Promisable<SignedHydratedBlockWithHashMeta[]>
@@ -16,7 +16,7 @@ export interface BlockViewerMethods {
16
16
  export const BlockViewerMoniker = 'BlockViewer' as const
17
17
  export type BlockViewerMoniker = typeof BlockViewerMoniker
18
18
 
19
- export interface BlockViewer extends BlockViewerMethods, Provider<BlockViewerMoniker> {
19
+ export interface BlockViewer<TMoniker extends ProviderMoniker = BlockViewerMoniker> extends BlockViewerMethods, Provider<TMoniker> {
20
20
  blockByHash(hash: Hash): Promisable<SignedHydratedBlockWithHashMeta | null>
21
21
  blockByNumber(block: XL1BlockNumber): Promisable<SignedHydratedBlockWithHashMeta | null>
22
22
  chainId(): Promisable<ChainId>
@@ -1,7 +1,7 @@
1
1
  import { type Promisable } from '@xylabs/sdk-js'
2
2
  import { zodIsFactory } from '@xylabs/zod'
3
3
  import type { HydratedBlock, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'
4
- import z from 'zod'
4
+ import { z } from 'zod'
5
5
 
6
6
  import {
7
7
  ChainQualificationZod, ChainQualifiedHeadConfigZod, ChainQualifiedRangeConfigZod, type Provider,
@@ -0,0 +1,19 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type {
3
+ SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta, XL1BlockNumber,
4
+ } from '@xyo-network/xl1-protocol'
5
+
6
+ import type { Provider } from '../model/index.ts'
7
+
8
+ export interface FinalizationViewerMethods {
9
+ head(): Promise<SignedHydratedBlockWithHashMeta>
10
+ }
11
+
12
+ export const FinalizationViewerMoniker = 'FinalizationViewer' as const
13
+ export type FinalizationViewerMoniker = typeof FinalizationViewerMoniker
14
+
15
+ export interface FinalizationViewer extends FinalizationViewerMethods, Provider<FinalizationViewerMoniker> {
16
+ headBlock(): Promise<SignedBlockBoundWitnessWithHashMeta>
17
+ headHash(): Promise<Hash>
18
+ headNumber(): Promise<XL1BlockNumber>
19
+ }