@xyo-network/xl1-protocol-sdk 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 (115) hide show
  1. package/dist/neutral/block/primitives/frames/calculateFramesFromRange.d.ts.map +1 -1
  2. package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts.map +1 -1
  3. package/dist/neutral/config/Config.d.ts +3 -15
  4. package/dist/neutral/config/Config.d.ts.map +1 -1
  5. package/dist/neutral/config/Producer.d.ts +1 -5
  6. package/dist/neutral/config/Producer.d.ts.map +1 -1
  7. package/dist/neutral/config/Validation.d.ts +2 -10
  8. package/dist/neutral/config/Validation.d.ts.map +1 -1
  9. package/dist/neutral/index.mjs +278 -48
  10. package/dist/neutral/index.mjs.map +1 -1
  11. package/dist/neutral/model/ChainContext/ChainStakeContext.d.ts +4 -5
  12. package/dist/neutral/model/ChainContext/ChainStakeContext.d.ts.map +1 -1
  13. package/dist/neutral/model/index.d.ts +0 -2
  14. package/dist/neutral/model/index.d.ts.map +1 -1
  15. package/dist/neutral/payloads/netBalancesForPayloads.d.ts +2 -4
  16. package/dist/neutral/payloads/netBalancesForPayloads.d.ts.map +1 -1
  17. package/dist/neutral/primitives/summary/balances/balancesSummary.d.ts.map +1 -1
  18. package/dist/neutral/primitives/summary/transfers/transfersSummary.d.ts.map +1 -1
  19. package/dist/neutral/services/AccountBalanceService.d.ts +1 -2
  20. package/dist/neutral/services/AccountBalanceService.d.ts.map +1 -1
  21. package/dist/neutral/services/AccountTransfersService.d.ts +1 -2
  22. package/dist/neutral/services/AccountTransfersService.d.ts.map +1 -1
  23. package/dist/neutral/services/BlockProducerService.d.ts +1 -2
  24. package/dist/neutral/services/BlockProducerService.d.ts.map +1 -1
  25. package/dist/neutral/services/BlockRewardService.d.ts +1 -2
  26. package/dist/neutral/services/BlockRewardService.d.ts.map +1 -1
  27. package/dist/neutral/services/Chain/BaseChainService.d.ts +1 -2
  28. package/dist/neutral/services/Chain/BaseChainService.d.ts.map +1 -1
  29. package/dist/neutral/services/Election.d.ts +1 -2
  30. package/dist/neutral/services/Election.d.ts.map +1 -1
  31. package/dist/neutral/services/NetworkStakeService.d.ts +1 -2
  32. package/dist/neutral/services/NetworkStakeService.d.ts.map +1 -1
  33. package/dist/neutral/services/PendingTransactionsService.d.ts +1 -2
  34. package/dist/neutral/services/PendingTransactionsService.d.ts.map +1 -1
  35. package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts +1 -2
  36. package/dist/neutral/services/StakeIntentService/StakeIntentService.d.ts.map +1 -1
  37. package/dist/neutral/services/index.d.ts +0 -3
  38. package/dist/neutral/services/index.d.ts.map +1 -1
  39. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts +17 -0
  40. package/dist/neutral/simple/accountBalance/SimpleAccountBalanceViewer.d.ts.map +1 -0
  41. package/dist/neutral/simple/accountBalance/index.d.ts +2 -0
  42. package/dist/neutral/simple/accountBalance/index.d.ts.map +1 -0
  43. package/dist/neutral/simple/gateway/SimpleXyoGatewayRunner.d.ts.map +1 -1
  44. package/dist/neutral/simple/index.d.ts +2 -0
  45. package/dist/neutral/simple/index.d.ts.map +1 -1
  46. package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts +15 -0
  47. package/dist/neutral/simple/timesync/SimpleTimeSyncViewer.d.ts.map +1 -0
  48. package/dist/neutral/simple/timesync/index.d.ts +2 -0
  49. package/dist/neutral/simple/timesync/index.d.ts.map +1 -0
  50. package/dist/neutral/viewers/AccountBalance.d.ts +4 -8
  51. package/dist/neutral/viewers/AccountBalance.d.ts.map +1 -1
  52. package/dist/neutral/viewers/Block.d.ts +5 -3
  53. package/dist/neutral/viewers/Block.d.ts.map +1 -1
  54. package/dist/neutral/viewers/Stake.d.ts +21 -1
  55. package/dist/neutral/viewers/Stake.d.ts.map +1 -1
  56. package/dist/neutral/{model → viewers}/StakeEvents.d.ts +1 -1
  57. package/dist/neutral/viewers/StakeEvents.d.ts.map +1 -0
  58. package/dist/neutral/viewers/TimeSync.d.ts +1 -2
  59. package/dist/neutral/viewers/TimeSync.d.ts.map +1 -1
  60. package/dist/neutral/viewers/index.d.ts +1 -0
  61. package/dist/neutral/viewers/index.d.ts.map +1 -1
  62. package/package.json +17 -16
  63. package/src/block/primitives/blockFromBlockNumber.ts +1 -1
  64. package/src/block/primitives/frames/calculateFramesFromRange.ts +3 -2
  65. package/src/block/primitives/transfers/transfersSummary.ts +4 -1
  66. package/src/model/ChainContext/ChainStakeContext.ts +6 -5
  67. package/src/model/index.ts +0 -2
  68. package/src/primitives/step/stepBlockRange.ts +1 -1
  69. package/src/primitives/step/stepTransferIndex.ts +1 -1
  70. package/src/primitives/summary/balances/balancesSummary.ts +4 -1
  71. package/src/primitives/summary/transfers/transfersSummary.ts +4 -1
  72. package/src/services/AccountBalanceService.ts +1 -2
  73. package/src/services/AccountTransfersService.ts +1 -3
  74. package/src/services/BlockProducerService.ts +1 -3
  75. package/src/services/BlockRewardService.ts +1 -3
  76. package/src/services/Chain/BaseChainService.ts +1 -3
  77. package/src/services/Election.ts +1 -3
  78. package/src/services/NetworkStakeService.ts +1 -2
  79. package/src/services/PendingTransactionsService.ts +1 -3
  80. package/src/services/StakeIntentService/StakeIntentService.ts +1 -3
  81. package/src/services/index.ts +0 -3
  82. package/src/simple/accountBalance/SimpleAccountBalanceViewer.ts +124 -0
  83. package/src/simple/accountBalance/index.ts +1 -0
  84. package/src/simple/gateway/SimpleXyoGatewayRunner.ts +1 -2
  85. package/src/simple/index.ts +2 -0
  86. package/src/simple/timesync/SimpleTimeSyncViewer.ts +94 -0
  87. package/src/simple/timesync/index.ts +1 -0
  88. package/src/viewers/AccountBalance.ts +4 -8
  89. package/src/viewers/Block.ts +5 -3
  90. package/src/viewers/Stake.ts +24 -2
  91. package/src/{model → viewers}/StakeEvents.ts +1 -1
  92. package/src/viewers/TimeSync.ts +1 -2
  93. package/src/viewers/index.ts +1 -0
  94. package/dist/neutral/model/ChainStake/ChainStakeRead.d.ts +0 -17
  95. package/dist/neutral/model/ChainStake/ChainStakeRead.d.ts.map +0 -1
  96. package/dist/neutral/model/ChainStake/ChainStakeStatic.d.ts +0 -7
  97. package/dist/neutral/model/ChainStake/ChainStakeStatic.d.ts.map +0 -1
  98. package/dist/neutral/model/ChainStake/ChainStakeWrite.d.ts +0 -6
  99. package/dist/neutral/model/ChainStake/ChainStakeWrite.d.ts.map +0 -1
  100. package/dist/neutral/model/ChainStake/index.d.ts +0 -4
  101. package/dist/neutral/model/ChainStake/index.d.ts.map +0 -1
  102. package/dist/neutral/model/StakeEvents.d.ts.map +0 -1
  103. package/dist/neutral/services/Service.d.ts +0 -5
  104. package/dist/neutral/services/Service.d.ts.map +0 -1
  105. package/dist/neutral/services/StepStakeService.d.ts +0 -5
  106. package/dist/neutral/services/StepStakeService.d.ts.map +0 -1
  107. package/dist/neutral/services/TimeSyncService.d.ts +0 -5
  108. package/dist/neutral/services/TimeSyncService.d.ts.map +0 -1
  109. package/src/model/ChainStake/ChainStakeRead.ts +0 -18
  110. package/src/model/ChainStake/ChainStakeStatic.ts +0 -7
  111. package/src/model/ChainStake/ChainStakeWrite.ts +0 -5
  112. package/src/model/ChainStake/index.ts +0 -3
  113. package/src/services/Service.ts +0 -5
  114. package/src/services/StepStakeService.ts +0 -4
  115. package/src/services/TimeSyncService.ts +0 -4
@@ -1,14 +1,15 @@
1
+ import type {
2
+ StakeEventsViewer, StakeRunner, StakeViewer,
3
+ } from '../../viewers/index.ts'
1
4
  import type { ChainIdentity } from '../ChainIdentity.ts'
2
- import type { ChainStakeRead, ChainStakeWrite } from '../ChainStake/index.ts'
3
- import type { StakeEventsRead } from '../StakeEvents.ts'
4
5
 
5
6
  export interface ChainStakeContextWrite extends ChainIdentity {
6
- stake: ChainStakeWrite
7
+ stake: StakeRunner
7
8
  }
8
9
 
9
10
  export interface ChainStakeContextRead extends ChainIdentity {
10
- events: StakeEventsRead
11
- stake: ChainStakeRead
11
+ events: StakeEventsViewer
12
+ stake: StakeViewer
12
13
  }
13
14
 
14
15
  export type ChainStakeContext = ChainStakeContextRead & ChainStakeContextWrite
@@ -1,10 +1,8 @@
1
1
  export * from './ChainContext/index.ts'
2
2
  export * from './ChainFork/index.ts'
3
3
  export * from './ChainIdentity.ts'
4
- export * from './ChainStake/index.ts'
5
4
  export * from './ChainStore.ts'
6
5
  export * from './PayloadMap.ts'
7
6
  export * from './Position.ts'
8
7
  export * from './RecordKeyType.ts'
9
- export * from './StakeEvents.ts'
10
8
  export * from './summary.ts'
@@ -4,5 +4,5 @@ import { asXL1BlockRange, StepSizes } from '@xyo-network/xl1-protocol'
4
4
  export function stepBlockRange({ block, step }: StepIdentity): XL1BlockRange {
5
5
  const stepSize = StepSizes[step]
6
6
  const start = block - stepSize
7
- return asXL1BlockRange([start, start + stepSize - 1], true)
7
+ return asXL1BlockRange([start, start + stepSize - 1], { name: 'stepBlockRange' })
8
8
  }
@@ -13,6 +13,6 @@ export function stepTransferIndex(block: number, step: number) {
13
13
  rewardTransferCount++
14
14
  }
15
15
  }
16
- assertEx(rewardTransferIndex >= 0, () => `Error: Could not find step size for step ${step} at block ${block}`)
16
+ assertEx(rewardTransferIndex >= 0, () => `Could not find step size for step ${step} at block ${block}`)
17
17
  return [rewardTransferIndex, rewardTransferCount]
18
18
  }
@@ -19,7 +19,10 @@ export async function balancesSummary(
19
19
  const headResult = await context.store.chainMap.get(headHash)
20
20
  const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult, () => `Head block not found for hash: ${headHash}`, { required: true })
21
21
  const rangeStart = asXL1BlockNumber(isDefined(context.windowSize) ? Math.max(headBoundWitness.block - context.windowSize + 1, 0) : 0)
22
- const ranges = deepCalculateFramesFromRange(asXL1BlockRange([rangeStart, headBoundWitness.block], true))
22
+ const ranges = deepCalculateFramesFromRange(asXL1BlockRange(
23
+ [rangeStart, headBoundWitness.block],
24
+ { name: 'balancesSummary' },
25
+ ))
23
26
  const summaries = await Promise.all(ranges.map(range => balancesStepSummaryFromRange(context, range)))
24
27
  const balances: Partial<Record<Address, bigint>> = {}
25
28
  for (let summary of summaries) {
@@ -20,7 +20,10 @@ export async function transfersSummary(
20
20
  const headResult = await context.store.chainMap.get(headHash)
21
21
  const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult, () => `Head block not found for hash: ${headHash}`, { required: true })
22
22
  const rangeStart = asXL1BlockNumber(isDefined(context.windowSize) ? Math.max(headBoundWitness.block - context.windowSize + 1, 0) : 0)
23
- const ranges = deepCalculateFramesFromRange(asXL1BlockRange([rangeStart, headBoundWitness.block], true))
23
+ const ranges = deepCalculateFramesFromRange(asXL1BlockRange(
24
+ [rangeStart, headBoundWitness.block],
25
+ { name: 'transfersSummary' },
26
+ ))
24
27
  const summaries = await Promise.all(ranges.map(range => transfersStepSummaryFromRange(context, range)))
25
28
  const transfers: Partial<Record<Address, Partial<Record<Address, bigint>>>> = {}
26
29
  for (let summary of summaries) {
@@ -1,5 +1,4 @@
1
1
  import type { AccountBalancesViewerMethods, AccountBalanceViewerMethods } from '../viewers/index.ts'
2
- import type { ServiceInterface } from './Service.ts'
3
2
 
4
- export interface AccountBalanceService extends AccountBalancesViewerMethods, AccountBalanceViewerMethods, ServiceInterface {
3
+ export interface AccountBalanceService extends AccountBalancesViewerMethods, AccountBalanceViewerMethods {
5
4
  }
@@ -2,11 +2,9 @@ import type { Address, Hash } from '@xylabs/hex'
2
2
  import type { Promisable } from '@xylabs/promise'
3
3
  import type { AttoXL1 } from '@xyo-network/xl1-protocol'
4
4
 
5
- import type { ServiceInterface } from './Service.ts'
6
-
7
5
  export interface AccountTransfersProvider {
8
6
  transfer(head: Hash, account: Address): Promisable<AttoXL1>
9
7
  transfers(head: Hash, accounts: Address[]): Promisable<Partial<Record<Address, AttoXL1>>>
10
8
  }
11
9
 
12
- export interface AccountTransfersService extends AccountTransfersProvider, ServiceInterface {}
10
+ export interface AccountTransfersService extends AccountTransfersProvider {}
@@ -3,8 +3,6 @@ import type {
3
3
  BlockBoundWitness, HydratedBlock, IterableRepository,
4
4
  } from '@xyo-network/xl1-protocol'
5
5
 
6
- import type { ServiceInterface } from './Service.ts'
7
-
8
6
  export type NextBlockProducer = IterableRepository<BlockBoundWitness, HydratedBlock | undefined>
9
7
 
10
- export interface BlockProducerService extends Addressable, NextBlockProducer, ServiceInterface {}
8
+ export interface BlockProducerService extends Addressable, NextBlockProducer {}
@@ -1,8 +1,6 @@
1
1
  import type { Promisable } from '@xylabs/promise'
2
2
 
3
- import type { ServiceInterface } from './Service.ts'
4
-
5
- export interface BlockRewardService extends ServiceInterface {
3
+ export interface BlockRewardService {
6
4
  // The amount of xl1 to send to the producer from the block reward
7
5
  getRewardForBlock(block: bigint): Promisable<bigint>
8
6
  }
@@ -1,7 +1,5 @@
1
1
  import type { ChainId } from '@xyo-network/xl1-protocol'
2
2
 
3
- import type { ServiceInterface } from '../Service.ts'
4
-
5
- export interface BaseChainService extends ServiceInterface {
3
+ export interface BaseChainService {
6
4
  chainId: ChainId
7
5
  }
@@ -2,9 +2,7 @@ import type { Address } from '@xylabs/hex'
2
2
  import type { WithHashMeta } from '@xyo-network/payload-model'
3
3
  import type { BlockBoundWitness } from '@xyo-network/xl1-protocol'
4
4
 
5
- import type { ServiceInterface } from './Service.ts'
6
-
7
- export interface ElectionService extends ServiceInterface {
5
+ export interface ElectionService {
8
6
 
9
7
  /**
10
8
  * Given the current block, get the leader for the next block
@@ -1,4 +1,3 @@
1
1
  import type { NetworkStakeStepRewardViewer } from '../viewers/index.ts'
2
- import type { ServiceInterface } from './Service.ts'
3
2
 
4
- export interface NetworkStakeStepRewardService extends NetworkStakeStepRewardViewer, ServiceInterface {}
3
+ export interface NetworkStakeStepRewardService extends NetworkStakeStepRewardViewer {}
@@ -1,8 +1,6 @@
1
1
  import type { Hash } from '@xylabs/hex'
2
2
  import type { SignedHydratedTransaction } from '@xyo-network/xl1-protocol'
3
3
 
4
- import type { ServiceInterface } from './Service.ts'
5
-
6
- export interface PendingTransactionsService extends ServiceInterface {
4
+ export interface PendingTransactionsService {
7
5
  getPendingTransactions(head: Hash, limit: number, timeout?: number): Promise<SignedHydratedTransaction[]>
8
6
  }
@@ -1,9 +1,7 @@
1
1
  import type { Address } from '@xylabs/hex'
2
2
  import type { Intent } from '@xyo-network/xl1-protocol'
3
3
 
4
- import type { ServiceInterface } from '../Service.ts'
5
-
6
- export interface StakeIntentService extends ServiceInterface {
4
+ export interface StakeIntentService {
7
5
 
8
6
  /**
9
7
  * Gets the declared ranges for an address based on historical on-chain data
@@ -8,7 +8,4 @@ export * from './ChainIterator/index.ts'
8
8
  export * from './Election.ts'
9
9
  export * from './NetworkStakeService.ts'
10
10
  export * from './PendingTransactionsService.ts'
11
- export * from './Service.ts'
12
11
  export * from './StakeIntentService/index.ts'
13
- export * from './StepStakeService.ts'
14
- export * from './TimeSyncService.ts'
@@ -0,0 +1,124 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { exists } from '@xylabs/exists'
3
+ import type { Address, Hash } from '@xylabs/hex'
4
+ import { spanRootAsync } from '@xylabs/telemetry'
5
+ import { isDefined } from '@xylabs/typeof'
6
+ import type { Signed } from '@xyo-network/boundwitness-model'
7
+ import type { WithStorageMeta } from '@xyo-network/payload-model'
8
+ import type {
9
+ BlockBoundWitness, Transfer, XL1BlockNumber, XL1BlockRange,
10
+ } from '@xyo-network/xl1-protocol'
11
+ import {
12
+ asRange, asXL1BlockNumber, asXL1BlockRange, AttoXL1,
13
+ StepSizes,
14
+ TransferSchema,
15
+ } from '@xyo-network/xl1-protocol'
16
+
17
+ import { deepCalculateFramesFromRange, transfersStepSummaryFromRange } from '../../block/index.ts'
18
+ import type { BalanceStepSummaryContext, TransfersStepSummaryContext } from '../../model/index.ts'
19
+ import type { TransfersStepSummary } from '../../payloads/index.ts'
20
+ import { balancesSummary } from '../../primitives/index.ts'
21
+ import type {
22
+ AccountBalanceHistoryItem, AccountBalanceViewer, BlockViewer,
23
+ } from '../../viewers/index.ts'
24
+
25
+ export class SimpleAccountBalanceViewer implements AccountBalanceViewer {
26
+ protected readonly blockViewer: BlockViewer
27
+ protected readonly context: BalanceStepSummaryContext
28
+ protected readonly transferContext: TransfersStepSummaryContext
29
+
30
+ constructor(context: BalanceStepSummaryContext, transferContext: TransfersStepSummaryContext, blockViewer: BlockViewer) {
31
+ this.context = context
32
+ this.transferContext = transferContext
33
+ this.blockViewer = blockViewer
34
+ }
35
+
36
+ async accountBalance(address: Address, headOrRange?: XL1BlockRange | Hash): Promise<AttoXL1> {
37
+ const balances = await this.accountBalances([address], headOrRange)
38
+ return balances[address] ?? AttoXL1(0n)
39
+ }
40
+
41
+ async accountBalanceHistory(address: Address, headOrRange?: XL1BlockRange | Hash): Promise<AccountBalanceHistoryItem[]> {
42
+ const range = asRange(headOrRange)
43
+ const startingRange = asXL1BlockRange(range ?? [0, await this.blockViewer.currentBlockNumber()], true)
44
+ const blockNumbers = await this.distillTransferHistory(address, startingRange)
45
+ const blocks = (await Promise.all(blockNumbers.map(async bn => await this.blockViewer.blockByNumber(bn)))).filter(exists)
46
+ const result: AccountBalanceHistoryItem[] = []
47
+ for (const block of blocks) {
48
+ const transferIndexes = block[0].payload_schemas.map((schema, index) => schema === TransferSchema ? index : undefined).filter(exists)
49
+ const transfers = transferIndexes.map((index) => {
50
+ const hash = block[0].payload_hashes[index]
51
+ return assertEx(
52
+ block[1].find(p => p._hash === hash) as WithStorageMeta<Transfer>,
53
+ () => `Error: Could not find Transfer with hash ${hash} in block ${block[0]._hash}`,
54
+ )
55
+ }).filter(exists).filter(t => ((t.from === address) || (isDefined(t.transfers[address]))))
56
+ if (transfers.length === 0) {
57
+ continue
58
+ }
59
+ const pairs: [WithStorageMeta<Signed<BlockBoundWitness>>, WithStorageMeta<Transfer>][] = (transfers.map((transfer) => {
60
+ return [block[0], transfer]
61
+ }))
62
+ result.push(...pairs.map(([block, transfer]) => [block,
63
+ null,
64
+ transfer] satisfies AccountBalanceHistoryItem))
65
+ }
66
+ return result
67
+ }
68
+
69
+ async accountBalances(address: Address[], _headOrRange?: XL1BlockRange | Hash): Promise<Partial<Record<Address, AttoXL1>>> {
70
+ return await spanRootAsync('balances', async () => {
71
+ const summary = await balancesSummary(
72
+ this.context,
73
+ )
74
+ const result: Record<Address, AttoXL1> = {}
75
+ for (const addr of address) {
76
+ const summaryBalance = summary[addr] ?? 0n
77
+ result[addr] = AttoXL1(summaryBalance < 0n ? 0n : summaryBalance)
78
+ }
79
+ return result
80
+ })
81
+ }
82
+
83
+ accountBalancesHistories(_addresses: Address[], _rangeOrHash?: XL1BlockRange | Hash): Promise<Partial<Record<Address, AccountBalanceHistoryItem[]>>> {
84
+ throw new Error('Method not implemented.')
85
+ }
86
+
87
+ private async distillTransferHistory(address: Address, range: XL1BlockRange, max: number = 50): Promise<XL1BlockNumber[]> {
88
+ if ((range[1] - range[0]) <= StepSizes[0] || max <= 1) {
89
+ return Array.from({ length: range[1] - range[0] + 1 }, (_, i) => range[1] - i).slice(0, max).map(n => asXL1BlockNumber(n, true))
90
+ }
91
+ const frames = deepCalculateFramesFromRange(asXL1BlockRange(range, true))
92
+ const transferSummaryPairs = await Promise.all(frames.map(
93
+ async (frame) => {
94
+ return [frame, await transfersStepSummaryFromRange(this.transferContext, frame)]
95
+ },
96
+ )) as [XL1BlockRange, WithStorageMeta<TransfersStepSummary>][]
97
+
98
+ const filteredTransferSummaryPairs = transferSummaryPairs.filter(([_, summary]) => Object.keys(summary.transfers).includes(address))
99
+
100
+ // sort it latest to earliest
101
+ const sortedTransferSummaryPairs = filteredTransferSummaryPairs.toSorted((a, b) => {
102
+ return b[0][1] - a[0][1]
103
+ })
104
+
105
+ const resultBlockNumbers: Set<XL1BlockNumber> = new Set()
106
+ for (const [frame] of sortedTransferSummaryPairs) {
107
+ if ((frame[1] - frame[0] + 1) > StepSizes[0]) {
108
+ const values = await this.distillTransferHistory(address, asXL1BlockRange([frame[0], frame[1] - 1], true), max - resultBlockNumbers.size)
109
+ for (const value of values) {
110
+ resultBlockNumbers.add(value)
111
+ }
112
+ resultBlockNumbers.add(frame[1])
113
+ } else {
114
+ for (let i = frame[0]; i <= frame[1]; i++) {
115
+ resultBlockNumbers.add(i)
116
+ }
117
+ }
118
+ if (resultBlockNumbers.size >= max) {
119
+ break
120
+ }
121
+ }
122
+ return [...resultBlockNumbers].toSorted((a, b) => b - a).slice(0, max)
123
+ }
124
+ }
@@ -0,0 +1 @@
1
+ export * from './SimpleAccountBalanceViewer.ts'
@@ -81,8 +81,7 @@ export class SimpleXyoGatewayRunner implements XyoGatewayRunner {
81
81
  const signedTx = await signer.signTransaction(tx)
82
82
  await this.addPayloadsToDataLakes(signedTx[1])
83
83
  return [await runner.broadcastTransaction(
84
- [await PayloadBuilder.addStorageMeta(signedTx[0]),
85
- await PayloadBuilder.addStorageMeta(signedTx[1])],
84
+ [signedTx[0], signedTx[1]],
86
85
  ), signedTx]
87
86
  }
88
87
 
@@ -1,3 +1,4 @@
1
+ export * from './accountBalance/index.ts'
1
2
  export * from './client/index.ts'
2
3
  export * from './datalake/index.ts'
3
4
  export * from './gateway/index.ts'
@@ -5,3 +6,4 @@ export * from './network/index.ts'
5
6
  export * from './permissions/index.ts'
6
7
  export * from './runner/index.ts'
7
8
  export * from './signer/index.ts'
9
+ export * from './timesync/index.ts'
@@ -0,0 +1,94 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import type { Hash } from '@xylabs/hex'
3
+ import { asHash } from '@xylabs/hex'
4
+ import type { Promisable } from '@xylabs/promise'
5
+ import { isDefined } from '@xylabs/typeof'
6
+ import type { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'
7
+ import {
8
+ asTimePayload, asXL1BlockNumber, TimeSchema,
9
+ } from '@xyo-network/xl1-protocol'
10
+ import type { Provider } from 'ethers'
11
+
12
+ import type { BlockViewer, TimeSyncViewer } from '../../viewers/index.ts'
13
+
14
+ export class SimpleTimeSyncViewer implements TimeSyncViewer {
15
+ protected readonly blockViewer: BlockViewer
16
+ protected readonly ethProvider?: Provider
17
+
18
+ constructor(blockViewer: BlockViewer, ethProvider?: Provider) {
19
+ this.blockViewer = blockViewer
20
+ this.ethProvider = ethProvider
21
+ }
22
+
23
+ async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {
24
+ switch (fromDomain) {
25
+ case 'xl1': {
26
+ const [block, payloads] = assertEx(await this.blockViewer.blockByNumber(asXL1BlockNumber(from, true)), () => 'Block not found')
27
+ const timeSchemaIndex = block.payload_schemas.indexOf(TimeSchema)
28
+ const hash = timeSchemaIndex === -1 ? undefined : block.payload_hashes[timeSchemaIndex]
29
+ const timePayload = asTimePayload(isDefined(hash) ? payloads.find(p => p._hash === hash) : undefined)
30
+ if (timePayload === undefined) return 0
31
+ switch (toDomain) {
32
+ case 'xl1': {
33
+ return timePayload.xl1 ?? 0
34
+ }
35
+ case 'epoch': {
36
+ return timePayload.epoch ?? 0
37
+ }
38
+ case 'ethereum': {
39
+ return timePayload.ethereum ?? 0
40
+ }
41
+ default: {
42
+ throw new Error(`Unsupported to toDomain: ${toDomain}`)
43
+ }
44
+ }
45
+ }
46
+ default: {
47
+ throw new Error(`Unsupported from fromDomain: ${fromDomain}`)
48
+ }
49
+ }
50
+ }
51
+
52
+ async currentTime(domain: TimeDomain): Promise<[string, number]> {
53
+ switch (domain) {
54
+ case 'xl1': {
55
+ return ['xl1', (await this.blockViewer.currentBlock())?.[0].block ?? -1]
56
+ }
57
+ case 'epoch': {
58
+ return ['epoch', Date.now()]
59
+ }
60
+ case 'ethereum': {
61
+ return ['ethereum', (await this.ethProvider?.getBlockNumber()) ?? 0]
62
+ }
63
+ default: {
64
+ throw new Error(`Unknown time domain: ${domain}`)
65
+ }
66
+ }
67
+ }
68
+
69
+ async currentTimeAndHash(domain: TimeDomain): Promise<[number, Hash | null]> {
70
+ switch (domain) {
71
+ case 'xl1': {
72
+ const [head] = await this.blockViewer.currentBlock()
73
+ return [head.block, head._hash]
74
+ }
75
+ case 'epoch': {
76
+ return [Date.now(), null]
77
+ }
78
+ case 'ethereum': {
79
+ const provider = assertEx(this.ethProvider, () => 'Ethereum provider not configured')
80
+ const blockNumber = (await provider.getBlockNumber()) ?? 0
81
+ const block = await provider.getBlock(blockNumber)
82
+ const blockHash = asHash(assertEx(block?.hash, () => 'Block hash not found'), true)
83
+ return [blockNumber, blockHash]
84
+ }
85
+ default: {
86
+ throw new Error(`Unknown time domain: ${domain}`)
87
+ }
88
+ }
89
+ }
90
+
91
+ currentTimePayload(): Promisable<TimePayload> {
92
+ throw new Error('Method not implemented.')
93
+ }
94
+ }
@@ -0,0 +1 @@
1
+ export * from './SimpleTimeSyncViewer.ts'
@@ -15,17 +15,13 @@ export type AccountBalanceHistoryItem = [
15
15
  ]
16
16
 
17
17
  export interface AccountBalancesViewerMethods {
18
- accountBalances(address: Address[], head?: Hash): Promisable<Partial<Record<Address, AttoXL1>>>
19
- accountBalances(address: Address[], range?: XL1BlockRange): Promisable<Partial<Record<Address, AttoXL1>>>
20
- accountBalancesHistories(address: Address[], head?: Hash): Promisable<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
21
- accountBalancesHistories(address: Address[], range?: XL1BlockRange): Promisable<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
18
+ accountBalances(address: Address[], headOrRange?: Hash | XL1BlockRange): Promisable<Partial<Record<Address, AttoXL1>>>
19
+ accountBalancesHistories(address: Address[], headOrRange?: Hash | XL1BlockRange): Promisable<Partial<Record<Address, AccountBalanceHistoryItem[]>>>
22
20
  }
23
21
 
24
22
  export interface AccountBalanceViewerMethods {
25
- accountBalance(address: Address, head?: Hash): Promisable<AttoXL1>
26
- accountBalance(address: Address, range?: XL1BlockRange): Promisable<AttoXL1>
27
- accountBalanceHistory(address: Address, head?: Hash): Promisable<AccountBalanceHistoryItem[]>
28
- accountBalanceHistory(address: Address, range?: XL1BlockRange): Promisable<AccountBalanceHistoryItem[]>
23
+ accountBalance(address: Address, headOrRange?: Hash | XL1BlockRange): Promisable<AttoXL1>
24
+ accountBalanceHistory(address: Address, headOrRange?: Hash | XL1BlockRange): Promisable<AccountBalanceHistoryItem[]>
29
25
  }
30
26
 
31
27
  export interface AccountBalanceViewer extends AccountBalanceViewerMethods {}
@@ -1,13 +1,15 @@
1
1
  import type { Hash } from '@xylabs/hex'
2
2
  import type { Promisable } from '@xylabs/promise'
3
- import type { HydratedBlock } from '@xyo-network/xl1-protocol'
3
+ import type { HydratedBlock, XL1BlockNumber } from '@xyo-network/xl1-protocol'
4
4
 
5
5
  export interface BlockViewierMethods {
6
6
  blockByHash(hash: Hash): Promisable<HydratedBlock | null>
7
- blockByNumber(blockNumber: number): Promisable<HydratedBlock | null>
7
+ blockByNumber(block: XL1BlockNumber): Promisable<HydratedBlock | null>
8
8
  blocksByHash(hash: Hash, limit?: number): Promisable<HydratedBlock[]>
9
9
 
10
10
  currentBlock(): Promisable<HydratedBlock>
11
11
  currentBlockHash(): Promisable<Hash>
12
- currentBlockNumber(): Promisable<number>
12
+ currentBlockNumber(): Promisable<XL1BlockNumber>
13
13
  }
14
+
15
+ export interface BlockViewer extends BlockViewierMethods {}
@@ -2,12 +2,34 @@ import type { Address } from '@xylabs/hex'
2
2
  import type { Promisable } from '@xylabs/promise'
3
3
 
4
4
  import type { Position } from '../model/index.ts'
5
+ import type { StakeEventsViewer } from './StakeEvents.ts'
6
+
7
+ export interface StakeViewerProperties {
8
+ minWithdrawalBlocks: number
9
+ rewardsContract: Address
10
+ stakingTokenAddress: Address
11
+ }
5
12
 
6
13
  export interface StakeViewerMethods {
7
14
  stakeById(id: number): Promisable<Position>
8
15
  stakeByStaker(staker: Address, slot: number): Promisable<Position>
9
- /* @deprecated use stakesByStaker */
10
- stakedByStaker(staker: Address): Promisable<Address[]>
11
16
  stakesByStaked(staked: Address): Promisable<Position[]>
12
17
  stakesByStaker(staker: Address): Promisable<Position[]>
13
18
  }
19
+
20
+ export interface StakeViewer extends StakeViewerMethods, StakeViewerProperties {
21
+ active(time?: number): Promisable<bigint>
22
+ activeByAddressStaked(address: string, time?: number): Promisable<bigint>
23
+ activeByStaker(address: string, time?: number): Promisable<bigint>
24
+ pending(time?: number): Promisable<bigint>
25
+ pendingByStaker(staker: string, time?: number): Promisable<bigint>
26
+ withdrawn(time?: number): Promisable<bigint>
27
+ withdrawnByStaker(staker: string, time?: number): Promisable<bigint>
28
+ }
29
+
30
+ export interface StakeRunner extends StakeViewer {
31
+ events: StakeEventsViewer
32
+ addStake(staked: string, amount: bigint): Promise<boolean>
33
+ removeStake(slot: bigint): Promise<boolean>
34
+ withdrawStake(slot: bigint): Promise<boolean>
35
+ }
@@ -33,7 +33,7 @@ export interface StakeEvent<TName extends StakeEventName = StakeEventName> exten
33
33
  args: StakeEventArgs
34
34
  }
35
35
 
36
- export interface StakeEventsRead {
36
+ export interface StakeEventsViewer {
37
37
  positionCount(range: [number, number | 'latest']): Promisable<number>
38
38
  stakeEvents<TName extends StakeEventName>(range: [number, number | 'latest'], filter?: StakeEventFilter<TName>): Promisable<StakeEvent<TName>[]>
39
39
  }
@@ -1,4 +1,3 @@
1
- import type { Hash } from '@xylabs/hex'
2
1
  import type { Promisable } from '@xylabs/promise'
3
2
  import type { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'
4
3
 
@@ -10,7 +9,7 @@ export interface TimeSyncViewerMethods {
10
9
  currentTime(domain: TimeDomain): Promisable<[string, number]>
11
10
 
12
11
  /** Get the current time for a given domain */
13
- currentTimeAndHash(domain: TimeDomain): Promisable<[number, Hash | null]>
12
+ currentTimeAndHash(domain: TimeDomain): Promisable<[number, string | null]>
14
13
 
15
14
  /** Create a TimePayload with the current time from all configured domains */
16
15
  currentTimePayload(): Promisable<TimePayload>
@@ -5,6 +5,7 @@ export * from './ChainContract.ts'
5
5
  export * from './Fork.ts'
6
6
  export * from './NetworkStakeStepReward.ts'
7
7
  export * from './Stake.ts'
8
+ export * from './StakeEvents.ts'
8
9
  export * from './StakeTotals.ts'
9
10
  export * from './StepStake.ts'
10
11
  export * from './TimeSync.ts'
@@ -1,17 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- import type { Promisable } from '@xylabs/promise';
3
- import type { Position } from '../Position.ts';
4
- export interface ChainStakeRead {
5
- active(time?: number): Promisable<bigint>;
6
- activeByAddressStaked(address: string, time?: number): Promisable<bigint>;
7
- activeByStaker(address: string, time?: number): Promisable<bigint>;
8
- pending(time?: number): Promisable<bigint>;
9
- pendingByStaker(staker: string, time?: number): Promisable<bigint>;
10
- stakeById(id: number, time?: number): Promisable<Position>;
11
- stakeByStaker(staker: Address, slot: number, time?: number): Promisable<Position>;
12
- stakesByStaked(staked: Address, range?: [number, number | undefined]): Promisable<Position[]>;
13
- stakesByStaker(staker: Address, range?: [number, number | undefined]): Promisable<Position[]>;
14
- withdrawn(time?: number): Promisable<bigint>;
15
- withdrawnByStaker(staker: string, time?: number): Promisable<bigint>;
16
- }
17
- //# sourceMappingURL=ChainStakeRead.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainStakeRead.d.ts","sourceRoot":"","sources":["../../../../src/model/ChainStake/ChainStakeRead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACzC,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACzE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAClE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAClE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC1D,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjF,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7F,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7F,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAC5C,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;CACrE"}
@@ -1,7 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- export interface ChainStakeStatic {
3
- minWithdrawalBlocks: number;
4
- rewardsContract: Address;
5
- stakingTokenAddress: Address;
6
- }
7
- //# sourceMappingURL=ChainStakeStatic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainStakeStatic.d.ts","sourceRoot":"","sources":["../../../../src/model/ChainStake/ChainStakeStatic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,eAAe,EAAE,OAAO,CAAA;IACxB,mBAAmB,EAAE,OAAO,CAAA;CAC7B"}
@@ -1,6 +0,0 @@
1
- export interface ChainStakeWrite {
2
- addStake(staked: string, amount: bigint): Promise<boolean>;
3
- removeStake(slot: bigint): Promise<boolean>;
4
- withdrawStake(slot: bigint): Promise<boolean>;
5
- }
6
- //# sourceMappingURL=ChainStakeWrite.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChainStakeWrite.d.ts","sourceRoot":"","sources":["../../../../src/model/ChainStake/ChainStakeWrite.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9C"}
@@ -1,4 +0,0 @@
1
- export * from './ChainStakeRead.ts';
2
- export * from './ChainStakeStatic.ts';
3
- export * from './ChainStakeWrite.ts';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/model/ChainStake/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"StakeEvents.d.ts","sourceRoot":"","sources":["../../../src/model/StakeEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,eAAe,2DAA4D,CAAA;AACxF,MAAM,MAAM,cAAc,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAA;AAE3D,MAAM,WAAW,aAAa,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,SAAS,UAAU,GAAG,EAAE;IACzF,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,KAAK,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IACxD,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAA;AAE5F,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,WAAW,CAAC,KAAK,CAAC;IACzG,IAAI,CAAC,EAAE,oBAAoB,CAAA;CAC5B;AAED,MAAM,WAAW,UAAU,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,aAAa,CAAC,KAAK,CAAC;IACrG,IAAI,EAAE,cAAc,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IACrE,WAAW,CAAC,KAAK,SAAS,cAAc,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;CACjJ"}
@@ -1,5 +0,0 @@
1
- import type { Hash } from '@xylabs/hex';
2
- export interface ServiceInterface {
3
- sync(head: Hash): Promise<void>;
4
- }
5
- //# sourceMappingURL=Service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Service.d.ts","sourceRoot":"","sources":["../../../src/services/Service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC"}
@@ -1,5 +0,0 @@
1
- import type { StepStakeViewer } from '../viewers/index.ts';
2
- import type { ServiceInterface } from './Service.ts';
3
- export interface StepStakeService extends ServiceInterface, StepStakeViewer {
4
- }
5
- //# sourceMappingURL=StepStakeService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StepStakeService.d.ts","sourceRoot":"","sources":["../../../src/services/StepStakeService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB,EAAE,eAAe;CAAG"}