@xyo-network/chain-services 1.16.8 → 1.16.10

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 (64) hide show
  1. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts +14 -4
  2. package/dist/neutral/AccountBalance/BaseAccountBalanceService.d.ts.map +1 -1
  3. package/dist/neutral/AccountBalance/accountBalanceServiceFromArchivist.d.ts.map +1 -1
  4. package/dist/neutral/AccountTransfers/index.d.ts +0 -1
  5. package/dist/neutral/AccountTransfers/index.d.ts.map +1 -1
  6. package/dist/neutral/BaseService.d.ts +2 -5
  7. package/dist/neutral/BaseService.d.ts.map +1 -1
  8. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts +4 -8
  9. package/dist/neutral/BlockProducer/BaseBlockProducerService.d.ts.map +1 -1
  10. package/dist/neutral/BlockProducer/spec/BaseBlockProducerService.spec.d.ts.map +1 -1
  11. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts +2 -1
  12. package/dist/neutral/BlockReward/BaseBlockRewardService.d.ts.map +1 -1
  13. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts +2 -2
  14. package/dist/neutral/BlockReward/EvmBlockRewardService.d.ts.map +1 -1
  15. package/dist/neutral/ChainService/Memory/Memory.d.ts +2 -2
  16. package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
  17. package/dist/neutral/ChainValidator/XyoValidator.d.ts +4 -7
  18. package/dist/neutral/ChainValidator/XyoValidator.d.ts.map +1 -1
  19. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts +3 -5
  20. package/dist/neutral/StakeIntent/XyoStakeIntentService.d.ts.map +1 -1
  21. package/dist/neutral/StepStake/BaseStepStakeService.d.ts +2 -2
  22. package/dist/neutral/StepStake/BaseStepStakeService.d.ts.map +1 -1
  23. package/dist/neutral/Time/BaseTimeSyncService.d.ts +11 -13
  24. package/dist/neutral/Time/BaseTimeSyncService.d.ts.map +1 -1
  25. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts +4 -0
  26. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -0
  27. package/dist/neutral/index.mjs +187 -235
  28. package/dist/neutral/index.mjs.map +1 -1
  29. package/dist/neutral/model/Params.d.ts +4 -4
  30. package/dist/neutral/model/Params.d.ts.map +1 -1
  31. package/package.json +25 -24
  32. package/src/AccountBalance/BaseAccountBalanceService.ts +31 -5
  33. package/src/AccountBalance/accountBalanceServiceFromArchivist.ts +1 -0
  34. package/src/AccountTransfers/index.ts +0 -1
  35. package/src/BaseService.ts +2 -8
  36. package/src/BlockProducer/BaseBlockProducerService.ts +4 -4
  37. package/src/BlockProducer/spec/BaseBlockProducerService.spec.ts +2 -5
  38. package/src/BlockReward/BaseBlockRewardService.ts +2 -1
  39. package/src/BlockReward/EvmBlockRewardService.ts +4 -2
  40. package/src/ChainService/Memory/Memory.ts +2 -2
  41. package/src/ChainValidator/XyoValidator.ts +2 -1
  42. package/src/StakeIntent/XyoStakeIntentService.ts +4 -3
  43. package/src/StepStake/BaseStepStakeService.ts +2 -2
  44. package/src/Time/BaseTimeSyncService.ts +27 -80
  45. package/src/blockViewerFromChainIteratorAndArchivist.ts +61 -0
  46. package/src/model/Params.ts +4 -4
  47. package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts +0 -6
  48. package/dist/neutral/AccountTransfers/accountTransfersServiceFromArchivist.d.ts.map +0 -1
  49. package/dist/neutral/ChainBlockIteration/ChainBlockNumberIterationService.d.ts +0 -21
  50. package/dist/neutral/ChainBlockIteration/ChainBlockNumberIterationService.d.ts.map +0 -1
  51. package/dist/neutral/ChainBlockIteration/index.d.ts +0 -3
  52. package/dist/neutral/ChainBlockIteration/index.d.ts.map +0 -1
  53. package/dist/neutral/ChainBlockIteration/model/BlockNumberIteration.d.ts +0 -7
  54. package/dist/neutral/ChainBlockIteration/model/BlockNumberIteration.d.ts.map +0 -1
  55. package/dist/neutral/ChainBlockIteration/model/Params.d.ts +0 -8
  56. package/dist/neutral/ChainBlockIteration/model/Params.d.ts.map +0 -1
  57. package/dist/neutral/ChainBlockIteration/model/index.d.ts +0 -3
  58. package/dist/neutral/ChainBlockIteration/model/index.d.ts.map +0 -1
  59. package/src/AccountTransfers/accountTransfersServiceFromArchivist.ts +0 -39
  60. package/src/ChainBlockIteration/ChainBlockNumberIterationService.ts +0 -105
  61. package/src/ChainBlockIteration/index.ts +0 -2
  62. package/src/ChainBlockIteration/model/BlockNumberIteration.ts +0 -7
  63. package/src/ChainBlockIteration/model/Params.ts +0 -9
  64. package/src/ChainBlockIteration/model/index.ts +0 -2
@@ -1,11 +1,11 @@
1
1
  import type { CreatableParams } from '@xylabs/creatable';
2
+ import type { EmptyObject } from '@xylabs/object';
2
3
  import type { AccountInstance } from '@xyo-network/account-model';
3
4
  import type { OpenTelemetryProviders } from '@xyo-network/xl1-protocol';
4
- import type { Config } from '@xyo-network/xl1-protocol-sdk';
5
- export interface BaseServiceParams extends CreatableParams, OpenTelemetryProviders {
6
- config: Config;
5
+ export interface BaseServiceParams<TConfig extends EmptyObject = EmptyObject> extends CreatableParams, OpenTelemetryProviders {
6
+ config: TConfig;
7
7
  }
8
- export interface BaseAccountableServiceParams extends BaseServiceParams {
8
+ export interface BaseAccountableServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
9
9
  account: AccountInstance;
10
10
  }
11
11
  //# sourceMappingURL=Params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/model/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAE3D,MAAM,WAAW,iBAAkB,SAAQ,eAAe,EAAE,sBAAsB;IAChF,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,4BAA6B,SAAQ,iBAAiB;IACrE,OAAO,EAAE,eAAe,CAAA;CACzB"}
1
+ {"version":3,"file":"Params.d.ts","sourceRoot":"","sources":["../../../src/model/Params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAEvE,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,eAAe,EAAE,sBAAsB;IAC3H,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,4BAA4B,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACzH,OAAO,EAAE,eAAe,CAAA;CACzB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "http://json.schemastore.org/package.json",
3
3
  "name": "@xyo-network/chain-services",
4
- "version": "1.16.8",
4
+ "version": "1.16.10",
5
5
  "description": "XYO Layer One SDK Services",
6
6
  "homepage": "https://xylabs.com",
7
7
  "bugs": {
@@ -37,52 +37,53 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@opentelemetry/api": "~1.9.0",
40
- "@xylabs/array": "~5.0.24",
41
- "@xylabs/assert": "~5.0.24",
42
- "@xylabs/creatable": "~5.0.24",
43
- "@xylabs/decimal-precision": "~5.0.24",
44
- "@xylabs/events": "~5.0.24",
45
- "@xylabs/exists": "~5.0.24",
46
- "@xylabs/forget": "~5.0.24",
47
- "@xylabs/hex": "~5.0.24",
48
- "@xylabs/promise": "~5.0.24",
49
- "@xylabs/telemetry": "~5.0.24",
50
- "@xylabs/typeof": "~5.0.24",
40
+ "@xylabs/array": "~5.0.25",
41
+ "@xylabs/assert": "~5.0.25",
42
+ "@xylabs/creatable": "~5.0.25",
43
+ "@xylabs/decimal-precision": "~5.0.25",
44
+ "@xylabs/events": "~5.0.25",
45
+ "@xylabs/exists": "~5.0.25",
46
+ "@xylabs/forget": "~5.0.25",
47
+ "@xylabs/hex": "~5.0.25",
48
+ "@xylabs/object": "~5.0.25",
49
+ "@xylabs/promise": "~5.0.25",
50
+ "@xylabs/telemetry": "~5.0.25",
51
+ "@xylabs/typeof": "~5.0.25",
51
52
  "@xyo-network/account-model": "~5.1.21",
52
53
  "@xyo-network/archivist-memory": "~5.1.21",
53
54
  "@xyo-network/archivist-model": "~5.1.21",
54
55
  "@xyo-network/boundwitness-model": "~5.1.21",
55
56
  "@xyo-network/boundwitness-validator": "~5.1.21",
56
57
  "@xyo-network/boundwitness-wrapper": "~5.1.21",
57
- "@xyo-network/chain-analyze": "~1.16.8",
58
- "@xyo-network/chain-modules": "~1.16.8",
59
- "@xyo-network/chain-protocol": "~1.16.8",
60
- "@xyo-network/chain-utils": "~1.16.8",
58
+ "@xyo-network/chain-analyze": "~1.16.10",
59
+ "@xyo-network/chain-modules": "~1.16.10",
60
+ "@xyo-network/chain-protocol": "~1.16.10",
61
+ "@xyo-network/chain-utils": "~1.16.10",
61
62
  "@xyo-network/payload-builder": "~5.1.21",
62
63
  "@xyo-network/payload-model": "~5.1.21",
63
64
  "@xyo-network/typechain": "~4.0.10",
64
- "@xyo-network/xl1-protocol": "~1.13.6",
65
- "@xyo-network/xl1-protocol-sdk": "~1.16.8",
66
- "@xyo-network/xl1-validation": "~1.16.8",
67
- "@xyo-network/xl1-wrappers": "~1.16.8",
65
+ "@xyo-network/xl1-protocol": "~1.13.11",
66
+ "@xyo-network/xl1-protocol-sdk": "~1.16.10",
67
+ "@xyo-network/xl1-validation": "~1.16.10",
68
+ "@xyo-network/xl1-wrappers": "~1.16.10",
68
69
  "async-mutex": "~0.5.0",
69
70
  "ethers": "6.15.0",
70
71
  "lru-cache": "~11.2.2"
71
72
  },
72
73
  "devDependencies": {
73
74
  "@types/node": "~24.10.1",
74
- "@xylabs/delay": "~5.0.24",
75
+ "@xylabs/delay": "~5.0.25",
75
76
  "@xylabs/ts-scripts-yarn3": "~7.2.8",
76
77
  "@xylabs/tsconfig": "~7.2.8",
77
- "@xylabs/vitest-extended": "~5.0.24",
78
+ "@xylabs/vitest-extended": "~5.0.25",
78
79
  "@xyo-network/account": "~5.1.21",
79
80
  "@xyo-network/account-model": "~5.1.21",
80
- "@xyo-network/chain-validation": "~1.16.8",
81
+ "@xyo-network/chain-validation": "~1.16.10",
81
82
  "@xyo-network/wallet": "~5.1.21",
82
83
  "eslint": "^9.39.1",
83
84
  "tslib": "~2.8.1",
84
85
  "typescript": "~5.9.3",
85
- "vitest": "~4.0.8",
86
+ "vitest": "~4.0.9",
86
87
  "vitest-mock-extended": "~3.1.0",
87
88
  "web3-types": "~1.10.0"
88
89
  },
@@ -1,31 +1,45 @@
1
1
  import { creatable } from '@xylabs/creatable'
2
2
  import { Address, Hash } from '@xylabs/hex'
3
- import { Promisable } from '@xylabs/promise'
4
3
  import { spanRootAsync } from '@xylabs/telemetry'
4
+ import { ReadArchivist } from '@xyo-network/archivist-model'
5
5
  import { AttoXL1, XL1BlockRange } from '@xyo-network/xl1-protocol'
6
6
  import {
7
7
  AccountBalanceHistoryItem,
8
8
  AccountBalanceService,
9
9
  balancesSummary,
10
10
  BalanceStepSummaryContext,
11
+ BlockViewer,
12
+ EventingChainBlockNumberIteratorService,
13
+ SimpleAccountBalanceViewer,
14
+ TransfersStepSummaryContext,
11
15
  } from '@xyo-network/xl1-protocol-sdk'
12
16
 
13
17
  import { BaseService } from '../BaseService.ts'
18
+ import { blockViewerFromChainIteratorAndArchivist } from '../blockViewerFromChainIteratorAndArchivist.ts'
14
19
  import { BaseServiceParams } from '../model/index.ts'
15
20
 
16
21
  export interface BaseAccountBalanceServiceParams extends BaseServiceParams {
22
+ chainArchivist: ReadArchivist
23
+ chainIterator: EventingChainBlockNumberIteratorService
17
24
  context: BalanceStepSummaryContext
25
+ transferContext: TransfersStepSummaryContext
18
26
  }
19
27
 
20
28
  @creatable()
21
29
  export class BaseAccountBalanceService extends BaseService<BaseAccountBalanceServiceParams> implements AccountBalanceService {
30
+ protected accountBalanceViewer!: AccountBalanceService
31
+ protected blockViewer!: BlockViewer
32
+
22
33
  async accountBalance(address: Address, headOrRange?: XL1BlockRange | Hash): Promise<AttoXL1> {
23
34
  const balances = await this.accountBalances([address], headOrRange)
24
35
  return balances[address] ?? AttoXL1(0n)
25
36
  }
26
37
 
27
- accountBalanceHistory(_address: Address, _headOrRange?: XL1BlockRange | Hash): Promisable<AccountBalanceHistoryItem[]> {
28
- throw new Error('Method not implemented.')
38
+ async accountBalanceHistory(address: Address): Promise<AccountBalanceHistoryItem[]>
39
+ async accountBalanceHistory(address: Address, head: Hash): Promise<AccountBalanceHistoryItem[]>
40
+ async accountBalanceHistory(address: Address, range: XL1BlockRange): Promise<AccountBalanceHistoryItem[]>
41
+ async accountBalanceHistory(address: Address, headOrRange?: Hash | XL1BlockRange): Promise<AccountBalanceHistoryItem[]> {
42
+ return await this.accountBalanceViewer.accountBalanceHistory(address, headOrRange)
29
43
  }
30
44
 
31
45
  async accountBalances(address: Address[], _headOrRange?: XL1BlockRange | Hash): Promise<Partial<Record<Address, AttoXL1>>> {
@@ -42,7 +56,19 @@ export class BaseAccountBalanceService extends BaseService<BaseAccountBalanceSer
42
56
  })
43
57
  }
44
58
 
45
- accountBalancesHistories(_address: Address[], _headOrRange?: XL1BlockRange | Hash): Promisable<Partial<Record<Address, AccountBalanceHistoryItem[]>>> {
46
- throw new Error('Method not implemented.')
59
+ async accountBalancesHistories(addresses: Address[]): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
60
+ async accountBalancesHistories(addresses: Address[], head: Hash): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
61
+ async accountBalancesHistories(addresses: Address[], range: XL1BlockRange): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
62
+ async accountBalancesHistories(addresses: Address[], headOrRange?: Hash | XL1BlockRange): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>> {
63
+ return await this.accountBalanceViewer.accountBalancesHistories(addresses, headOrRange)
64
+ }
65
+
66
+ override createHandler() {
67
+ this.blockViewer = blockViewerFromChainIteratorAndArchivist(this.params.chainIterator, this.params.chainArchivist)
68
+ this.accountBalanceViewer = new SimpleAccountBalanceViewer(
69
+ this.params.context,
70
+ this.params.transferContext,
71
+ this.blockViewer,
72
+ )
47
73
  }
48
74
  }
@@ -11,6 +11,7 @@ import { Semaphore } from 'async-mutex'
11
11
 
12
12
  import { BaseAccountBalanceService } from './BaseAccountBalanceService.ts'
13
13
 
14
+ // this is intended to only be used for testing
14
15
  export const accountBalancesServiceFromArchivist = async (
15
16
  chainId: ChainId,
16
17
  archivist: ReadArchivist<WithStorageMeta<Payload>>,
@@ -1,2 +1 @@
1
- export * from './accountTransfersServiceFromArchivist.ts'
2
1
  export * from './BaseAccountTransfersService.ts'
@@ -1,9 +1,7 @@
1
1
  import { AbstractCreatable, creatable } from '@xylabs/creatable'
2
2
  import type { EventData } from '@xylabs/events'
3
- import { Hash } from '@xylabs/hex'
4
3
  import type { Promisable } from '@xylabs/promise'
5
4
  import { spanRoot, spanRootAsync } from '@xylabs/telemetry'
6
- import type { ServiceInterface } from '@xyo-network/xl1-protocol-sdk'
7
5
  import { Mutex } from 'async-mutex'
8
6
 
9
7
  import type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'
@@ -14,7 +12,7 @@ declare global {
14
12
 
15
13
  @creatable()
16
14
  export class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>
17
- extends AbstractCreatable<TParams, TEventData> implements ServiceInterface {
15
+ extends AbstractCreatable<TParams, TEventData> {
18
16
  private static singletonInitMutex = new Mutex()
19
17
 
20
18
  static get singletons() {
@@ -39,10 +37,6 @@ export class BaseService<TParams extends BaseServiceParams = BaseServiceParams,
39
37
  async spanAsync<T>(name: string, fn: () => Promise<T>): Promise<T> {
40
38
  return await spanRootAsync(name, fn, this.tracer)
41
39
  }
42
-
43
- sync(_head: Hash): Promise<void> {
44
- throw new Error('Method not implemented.')
45
- }
46
40
  }
47
41
 
48
42
  export abstract class BaseAccountableService<
@@ -51,7 +45,7 @@ export abstract class BaseAccountableService<
51
45
  // Base class for services that have an account
52
46
  }
53
47
 
54
- export interface CreatableService<T extends BaseService = BaseService> extends ServiceInterface {
48
+ export interface CreatableService<T extends BaseService = BaseService> {
55
49
  new(params: T['params']): T
56
50
  create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>
57
51
  }
@@ -3,7 +3,7 @@ import { assertEx } from '@xylabs/assert'
3
3
  import { creatable } from '@xylabs/creatable'
4
4
  import { exists } from '@xylabs/exists'
5
5
  import {
6
- Address, Hex, hexToBigInt, toHex,
6
+ Address, asHash, Hex, hexToBigInt, toHex,
7
7
  } from '@xylabs/hex'
8
8
  import { isDefined } from '@xylabs/typeof'
9
9
  import { ArchivistInstance } from '@xyo-network/archivist-model'
@@ -20,7 +20,7 @@ import {
20
20
  Transfer, XYO_STEP_REWARD_ADDRESS,
21
21
  } from '@xyo-network/xl1-protocol'
22
22
  import {
23
- AccountBalanceService, BlockProducerService, PendingTransactionsService, StakeIntentService, TimeSyncViewer,
23
+ AccountBalanceService, BlockProducerService, Config, PendingTransactionsService, StakeIntentService, TimeSyncViewer,
24
24
  } from '@xyo-network/xl1-protocol-sdk'
25
25
 
26
26
  import { BaseService } from '../BaseService.ts'
@@ -43,7 +43,7 @@ export const XYO_PRODUCER_REDECLARATION_DURATION = 10_000
43
43
  */
44
44
  export const XYO_PRODUCER_REDECLARATION_WINDOW = 500
45
45
 
46
- export interface BaseBlockProducerServiceParams extends XyoValidatorParams {
46
+ export interface BaseBlockProducerServiceParams extends XyoValidatorParams<Pick<Config, 'producer'>> {
47
47
  balanceService: AccountBalanceService
48
48
  pendingTransactionsService: PendingTransactionsService
49
49
  rejectedTransactionsArchivist: ArchivistInstance
@@ -277,7 +277,7 @@ export class BaseBlockProducerService extends BaseService<BaseBlockProducerServi
277
277
 
278
278
  private async generateTimePayload(head: WithStorageMeta<BlockBoundWitness>) {
279
279
  const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')
280
- const ethereumHash = assertEx(ethHashOrNull, () => 'No ethereum hash available from time sync service')
280
+ const ethereumHash = asHash(ethHashOrNull, () => 'No ethereum hash available from time sync service')
281
281
  const timePayload: TimePayload = {
282
282
  schema: TimeSchema,
283
283
  // note, this is for the previous block
@@ -1,4 +1,3 @@
1
- /* eslint-disable max-statements */
2
1
  import '@xylabs/vitest-extended'
3
2
 
4
3
  import { filterAs } from '@xylabs/array'
@@ -287,10 +286,8 @@ describe('XyoBlockProducer', () => {
287
286
  expect(blockRewardTransfer).toBeDefined()
288
287
  let totalTransfer = 0n
289
288
  for (const value of Object.values(blockRewardTransfer?.transfers ?? {})) {
290
- if (value) {
291
- const bigIntValue = hexToBigInt(value)
292
- totalTransfer += bigIntValue
293
- }
289
+ const bigIntValue = hexToBigInt(value)
290
+ totalTransfer += bigIntValue
294
291
  }
295
292
  expect(totalTransfer).toEqual(3_000_000_000_000_000_000_000n)
296
293
  }
@@ -1,11 +1,12 @@
1
1
  import { creatable } from '@xylabs/creatable'
2
+ import { EmptyObject } from '@xylabs/object'
2
3
  import { Promisable } from '@xylabs/promise'
3
4
  import { BlockRewardService } from '@xyo-network/xl1-protocol-sdk'
4
5
 
5
6
  import { BaseService } from '../BaseService.ts'
6
7
  import { BaseServiceParams } from '../model/index.ts'
7
8
 
8
- export interface BaseBlockRewardServiceParams extends BaseServiceParams {}
9
+ export interface BaseBlockRewardServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {}
9
10
 
10
11
  @creatable()
11
12
  export class BaseBlockRewardService<TParams extends BaseBlockRewardServiceParams = BaseBlockRewardServiceParams>
@@ -3,12 +3,14 @@ import { creatable } from '@xylabs/creatable'
3
3
  import { toEthAddress } from '@xylabs/hex'
4
4
  import { AccountInstance } from '@xyo-network/account-model'
5
5
  import { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'
6
- import { BlockRewardService, ChainService } from '@xyo-network/xl1-protocol-sdk'
6
+ import {
7
+ BlockRewardService, ChainService, Config,
8
+ } from '@xyo-network/xl1-protocol-sdk'
7
9
  import { Provider } from 'ethers/providers'
8
10
 
9
11
  import { BaseBlockRewardService, BaseBlockRewardServiceParams } from './BaseBlockRewardService.ts'
10
12
 
11
- export interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams {
13
+ export interface EvmBlockRewardServiceParams extends BaseBlockRewardServiceParams<Pick<Config, 'evm'>> {
12
14
  account: AccountInstance
13
15
  chainService?: ChainService
14
16
  provider?: Provider
@@ -1,11 +1,11 @@
1
1
  import type { Address } from '@xylabs/hex'
2
2
  import { ZERO_ADDRESS } from '@xylabs/hex'
3
- import type { ChainService } from '@xyo-network/xl1-protocol-sdk'
3
+ import type { ChainService, Config } from '@xyo-network/xl1-protocol-sdk'
4
4
 
5
5
  import { BaseService } from '../../BaseService.ts'
6
6
  import type { BaseServiceParams } from '../../model/index.ts'
7
7
 
8
- export interface MemoryChainServiceParams extends BaseServiceParams {}
8
+ export interface MemoryChainServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {}
9
9
 
10
10
  /**
11
11
  * A class that represents a chain stake as backed in memory
@@ -1,5 +1,6 @@
1
1
  import { assertEx } from '@xylabs/assert'
2
2
  import { creatable } from '@xylabs/creatable'
3
+ import { EmptyObject } from '@xylabs/object'
3
4
  import { Promisable } from '@xylabs/promise'
4
5
  import { AccountInstance } from '@xyo-network/account-model'
5
6
  import { ArchivistInstance, ReadArchivist } from '@xyo-network/archivist-model'
@@ -16,7 +17,7 @@ import { BaseService } from '../BaseService.ts'
16
17
  import { BaseServiceParams } from '../model/index.ts'
17
18
  import { Validator } from './model/index.ts'
18
19
 
19
- export interface XyoValidatorParams extends BaseServiceParams {
20
+ export interface XyoValidatorParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
20
21
  account: AccountInstance
21
22
  chainArchivist: ReadArchivist
22
23
  chainId: ChainId
@@ -23,6 +23,7 @@ import {
23
23
  import {
24
24
  asChainIndexingServiceStateWithStorageMeta,
25
25
  ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,
26
+ Config,
26
27
  EventingChainBlockNumberIteratorService,
27
28
  isChainIndexingServiceState,
28
29
  readPayloadMapFromStore,
@@ -34,7 +35,7 @@ import { LRUCache } from 'lru-cache'
34
35
  import { BaseService } from '../BaseService.ts'
35
36
  import { BaseServiceParams } from '../model/index.ts'
36
37
 
37
- export interface XyoStakeIntentServiceParams extends BaseServiceParams {
38
+ export interface XyoStakeIntentServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {
38
39
  chainArchivist?: ArchivistInstance
39
40
  chainIterator?: EventingChainBlockNumberIteratorService
40
41
  chainStakeViewer?: ChainStakeViewer
@@ -93,14 +94,14 @@ export class XyoStakeIntentService extends BaseService<XyoStakeIntentServicePara
93
94
 
94
95
  async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {
95
96
  await Promise.resolve()
96
- assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)
97
+ assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
97
98
  const results = this._producers.get(address)
98
99
  return results ?? []
99
100
  }
100
101
 
101
102
  async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {
102
103
  return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {
103
- assertEx(intent === 'producer', () => `Error: Support not yet added for intent ${intent}`)
104
+ assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)
104
105
  const results = this._producers.findAllContaining(block)
105
106
  const candidates = [...results]
106
107
  const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)
@@ -3,7 +3,7 @@ import { Address } from '@xylabs/hex'
3
3
  import { Promisable } from '@xylabs/promise'
4
4
  import { ReadArchivist } from '@xyo-network/archivist-model'
5
5
  import { StepIdentity } from '@xyo-network/xl1-protocol'
6
- import { StepStakeService } from '@xyo-network/xl1-protocol-sdk'
6
+ import { StepStakeViewer } from '@xyo-network/xl1-protocol-sdk'
7
7
 
8
8
  import { BaseService } from '../BaseService.ts'
9
9
  import { BaseServiceParams } from '../model/index.ts'
@@ -13,7 +13,7 @@ export interface BaseStepStakeServiceParams extends BaseServiceParams {
13
13
  }
14
14
 
15
15
  @creatable()
16
- export class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeService {
16
+ export class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeViewer {
17
17
  stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {
18
18
  throw new Error('Method not implemented.')
19
19
  }
@@ -1,113 +1,60 @@
1
- import { assertEx } from '@xylabs/assert'
2
1
  import { creatable } from '@xylabs/creatable'
3
- import { asHash, Hash } from '@xylabs/hex'
4
- import { Promisable } from '@xylabs/promise'
2
+ import { EmptyObject } from '@xylabs/object'
5
3
  import { ReadArchivist } from '@xyo-network/archivist-model'
6
- import { PayloadBuilder } from '@xyo-network/payload-builder'
4
+ import { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'
7
5
  import {
8
- asTimePayload,
9
- TimeDomain, TimePayload, TimeSchema,
10
- } from '@xyo-network/xl1-protocol'
11
- import { EventingChainBlockNumberIteratorService, TimeSyncService } from '@xyo-network/xl1-protocol-sdk'
6
+ EventingChainBlockNumberIteratorService, SimpleTimeSyncViewer, TimeSyncViewer,
7
+ } from '@xyo-network/xl1-protocol-sdk'
12
8
  import { Provider } from 'ethers'
13
9
 
14
10
  import { BaseService } from '../BaseService.ts'
11
+ import { blockViewerFromChainIteratorAndArchivist } from '../blockViewerFromChainIteratorAndArchivist.ts'
15
12
  import { BaseServiceParams } from '../model/index.ts'
16
13
 
17
- export interface TimeProvider {
18
- currentTime(): Promise<[string, number]>
19
- }
20
-
21
- export interface BaseTimeServiceParams extends BaseServiceParams {
14
+ export interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
22
15
  chainArchivist: ReadArchivist
23
16
  chainIterator: EventingChainBlockNumberIteratorService
24
17
  ethProvider?: Provider
25
18
  }
26
19
 
27
20
  @creatable()
28
- export class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncService {
29
- get chainArchivist() {
21
+ export class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncViewer {
22
+ protected timeSyncViewer!: TimeSyncViewer
23
+
24
+ protected get chainArchivist() {
30
25
  return this.params.chainArchivist
31
26
  }
32
27
 
33
- get chainIterator() {
28
+ protected get chainIterator() {
34
29
  return this.params.chainIterator
35
30
  }
36
31
 
37
- get ethProvider() {
32
+ protected get ethProvider() {
38
33
  return this.params.ethProvider
39
34
  }
40
35
 
41
36
  async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {
42
- switch (fromDomain) {
43
- case 'xl1': {
44
- const block = assertEx(await this.chainIterator.get(from), () => 'Block not found')
45
- const timeSchemaIndex = block.payload_schemas.indexOf(TimeSchema)
46
- const hash = timeSchemaIndex === -1 ? undefined : block.payload_hashes[timeSchemaIndex]
47
- const [payload] = hash === undefined ? [] : await this.chainArchivist.get([hash])
48
- const timePayload = asTimePayload(payload)
49
- if (timePayload === undefined) return 0
50
- switch (toDomain) {
51
- case 'xl1': {
52
- return timePayload.xl1 ?? 0
53
- }
54
- case 'epoch': {
55
- return timePayload.epoch ?? 0
56
- }
57
- case 'ethereum': {
58
- return timePayload.ethereum ?? 0
59
- }
60
- default: {
61
- throw new Error(`Unsupported to toDomain: ${toDomain}`)
62
- }
63
- }
64
- }
65
- default: {
66
- throw new Error(`Unsupported from fromDomain: ${fromDomain}`)
67
- }
68
- }
37
+ return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from)
38
+ }
39
+
40
+ override async createHandler(): Promise<void> {
41
+ await super.createHandler()
42
+ const blockViewer = blockViewerFromChainIteratorAndArchivist(
43
+ this.chainIterator,
44
+ this.chainArchivist,
45
+ )
46
+ this.timeSyncViewer = new SimpleTimeSyncViewer(blockViewer, this.ethProvider)
69
47
  }
70
48
 
71
49
  async currentTime(domain: TimeDomain): Promise<[string, number]> {
72
- switch (domain) {
73
- case 'xl1': {
74
- return ['xl1', (await this.chainIterator.head()).block]
75
- }
76
- case 'epoch': {
77
- return ['epoch', Date.now()]
78
- }
79
- case 'ethereum': {
80
- return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]
81
- }
82
- default: {
83
- throw new Error(`Unknown time domain: ${domain}`)
84
- }
85
- }
50
+ return await this.timeSyncViewer.currentTime(domain)
86
51
  }
87
52
 
88
- async currentTimeAndHash(domain: TimeDomain): Promise<[number, Hash | null]> {
89
- switch (domain) {
90
- case 'xl1': {
91
- const head = await this.chainIterator.head()
92
- return [head.block, await PayloadBuilder.hash(head)]
93
- }
94
- case 'epoch': {
95
- return [Date.now(), null]
96
- }
97
- case 'ethereum': {
98
- const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')
99
- const blockNumber = (await provider.getBlockNumber()) ?? 0
100
- const block = await provider.getBlock(blockNumber)
101
- const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)
102
- return [blockNumber, blockHash]
103
- }
104
- default: {
105
- throw new Error(`Unknown time domain: ${domain}`)
106
- }
107
- }
53
+ async currentTimeAndHash(domain: TimeDomain): Promise<[number, string | null]> {
54
+ return await this.timeSyncViewer.currentTimeAndHash(domain)
108
55
  }
109
56
 
110
- currentTimePayload(): Promisable<TimePayload> {
111
- throw new Error('Method not implemented.')
57
+ async currentTimePayload(): Promise<TimePayload> {
58
+ return await this.timeSyncViewer.currentTimePayload()
112
59
  }
113
60
  }
@@ -0,0 +1,61 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import { isDefined } from '@xylabs/typeof'
3
+ import type { ReadArchivist } from '@xyo-network/archivist-model'
4
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
5
+ import type {
6
+ HydratedBlock,
7
+ XL1BlockNumber,
8
+ } from '@xyo-network/xl1-protocol'
9
+ import { asBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'
10
+ import type { BlockViewer, EventingChainBlockNumberIteratorService } from '@xyo-network/xl1-protocol-sdk'
11
+
12
+ export function blockViewerFromChainIteratorAndArchivist(
13
+ chainIterator: EventingChainBlockNumberIteratorService,
14
+ chainArchivist: ReadArchivist,
15
+ ): BlockViewer {
16
+ const result = {
17
+ blockByHash: async function (hash: Hash): Promise<HydratedBlock | null> {
18
+ const [payload] = await chainArchivist.get([hash])
19
+ const block = asBlockBoundWitnessWithStorageMeta(payload)
20
+ if (isDefined(block)) {
21
+ const payloads = await chainArchivist.get(block.payload_hashes)
22
+ return [block, payloads]
23
+ }
24
+ return null
25
+ },
26
+ blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<HydratedBlock | null> {
27
+ const payload = await chainIterator.get(blockNumber)
28
+ const block = payload ? await PayloadBuilder.addStorageMeta(payload) : undefined
29
+ if (isDefined(block)) {
30
+ const payloads = await chainArchivist.get(block.payload_hashes)
31
+ return [block, payloads]
32
+ }
33
+ return null
34
+ },
35
+ blocksByHash: async function (hash: Hash, limit = 10): Promise<HydratedBlock[]> {
36
+ const results: HydratedBlock[] = []
37
+ for (let i = 0; i < limit; i++) {
38
+ const block = await this.blockByHash(hash)
39
+ if (block) {
40
+ results.push(block)
41
+ } else {
42
+ break
43
+ }
44
+ }
45
+ return results
46
+ },
47
+ currentBlock: async function (): Promise<HydratedBlock> {
48
+ const head = await chainIterator.head()
49
+ return this.blockByHash(head._hash) as Promise<HydratedBlock>
50
+ },
51
+ currentBlockHash: async function (): Promise<Hash> {
52
+ const head = await chainIterator.head()
53
+ return head._hash
54
+ },
55
+ currentBlockNumber: async function (): Promise<XL1BlockNumber> {
56
+ const head = await chainIterator.head()
57
+ return head.block
58
+ },
59
+ } satisfies BlockViewer
60
+ return result
61
+ }
@@ -1,12 +1,12 @@
1
1
  import type { CreatableParams } from '@xylabs/creatable'
2
+ import type { EmptyObject } from '@xylabs/object'
2
3
  import type { AccountInstance } from '@xyo-network/account-model'
3
4
  import type { OpenTelemetryProviders } from '@xyo-network/xl1-protocol'
4
- import type { Config } from '@xyo-network/xl1-protocol-sdk'
5
5
 
6
- export interface BaseServiceParams extends CreatableParams, OpenTelemetryProviders {
7
- config: Config
6
+ export interface BaseServiceParams<TConfig extends EmptyObject = EmptyObject> extends CreatableParams, OpenTelemetryProviders {
7
+ config: TConfig
8
8
  }
9
9
 
10
- export interface BaseAccountableServiceParams extends BaseServiceParams {
10
+ export interface BaseAccountableServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {
11
11
  account: AccountInstance
12
12
  }
@@ -1,6 +0,0 @@
1
- import type { ReadArchivist } from '@xyo-network/archivist-model';
2
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model';
3
- import type { ChainId } from '@xyo-network/xl1-protocol';
4
- import type { AccountTransfersService } from '@xyo-network/xl1-protocol-sdk';
5
- export declare const accountTransfersServiceFromArchivist: (chainId: ChainId, archivist: ReadArchivist<WithStorageMeta<Payload>>) => Promise<AccountTransfersService>;
6
- //# sourceMappingURL=accountTransfersServiceFromArchivist.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"accountTransfersServiceFromArchivist.d.ts","sourceRoot":"","sources":["../../../src/AccountTransfers/accountTransfersServiceFromArchivist.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,KAAK,EAAE,uBAAuB,EAAwB,MAAM,+BAA+B,CAAA;AAMlG,eAAO,MAAM,oCAAoC,GAC/C,SAAS,OAAO,EAChB,WAAW,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,KACjD,OAAO,CAAC,uBAAuB,CAsBjC,CAAA"}