@xyo-network/xl1-protocol-sdk 1.14.3 → 1.15.0

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 (159) hide show
  1. package/dist/neutral/block/hydrate/allHashesPresent.d.ts +4 -0
  2. package/dist/neutral/block/hydrate/allHashesPresent.d.ts.map +1 -0
  3. package/dist/neutral/block/hydrate/blockPayloadsFromHydratedBlock.d.ts +4 -0
  4. package/dist/neutral/block/hydrate/blockPayloadsFromHydratedBlock.d.ts.map +1 -0
  5. package/dist/neutral/block/hydrate/flattenHydratedBlock.d.ts +4 -0
  6. package/dist/neutral/block/hydrate/flattenHydratedBlock.d.ts.map +1 -0
  7. package/dist/neutral/block/hydrate/flattenHydratedBlocks.d.ts +4 -0
  8. package/dist/neutral/block/hydrate/flattenHydratedBlocks.d.ts.map +1 -0
  9. package/dist/neutral/block/hydrate/hydrateBlock.d.ts +5 -0
  10. package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -0
  11. package/dist/neutral/block/hydrate/index.d.ts +8 -0
  12. package/dist/neutral/block/hydrate/index.d.ts.map +1 -0
  13. package/dist/neutral/block/hydrate/transactionsFromHydratedBlock.d.ts +4 -0
  14. package/dist/neutral/block/hydrate/transactionsFromHydratedBlock.d.ts.map +1 -0
  15. package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts +5 -0
  16. package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -0
  17. package/dist/neutral/block/index.d.ts +1 -1
  18. package/dist/neutral/block/index.d.ts.map +1 -1
  19. package/dist/neutral/block/primitives/balances/balancesStepSummaryFromRange.d.ts +6 -0
  20. package/dist/neutral/block/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -0
  21. package/dist/neutral/block/primitives/balances/balancesSummary.d.ts +4 -0
  22. package/dist/neutral/block/primitives/balances/balancesSummary.d.ts.map +1 -0
  23. package/dist/neutral/block/primitives/balances/index.d.ts +3 -0
  24. package/dist/neutral/block/primitives/balances/index.d.ts.map +1 -0
  25. package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts +5 -0
  26. package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts.map +1 -0
  27. package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
  28. package/dist/neutral/block/primitives/index.d.ts +4 -3
  29. package/dist/neutral/block/primitives/index.d.ts.map +1 -1
  30. package/dist/neutral/block/primitives/model.d.ts +5 -2
  31. package/dist/neutral/block/primitives/model.d.ts.map +1 -1
  32. package/dist/neutral/block/primitives/{payloads.d.ts → payloads/BalancesStepSummary.d.ts} +5 -16
  33. package/dist/neutral/block/primitives/payloads/BalancesStepSummary.d.ts.map +1 -0
  34. package/dist/neutral/block/primitives/payloads/ChainWindow.d.ts +6 -0
  35. package/dist/neutral/block/primitives/payloads/ChainWindow.d.ts.map +1 -0
  36. package/dist/neutral/block/primitives/payloads/StepSummary.d.ts +11 -0
  37. package/dist/neutral/block/primitives/payloads/StepSummary.d.ts.map +1 -0
  38. package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts +21 -0
  39. package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts.map +1 -0
  40. package/dist/neutral/block/primitives/payloads/index.d.ts +5 -0
  41. package/dist/neutral/block/primitives/payloads/index.d.ts.map +1 -0
  42. package/dist/neutral/block/primitives/transfers/index.d.ts +3 -0
  43. package/dist/neutral/block/primitives/transfers/index.d.ts.map +1 -0
  44. package/dist/neutral/block/primitives/transfers/transfersStepSummaryFromRange.d.ts +6 -0
  45. package/dist/neutral/block/primitives/transfers/transfersStepSummaryFromRange.d.ts.map +1 -0
  46. package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts +4 -0
  47. package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts.map +1 -0
  48. package/dist/neutral/config/Config.d.ts +10 -0
  49. package/dist/neutral/config/Config.d.ts.map +1 -1
  50. package/dist/neutral/config/Producer.d.ts +10 -0
  51. package/dist/neutral/config/Producer.d.ts.map +1 -1
  52. package/dist/neutral/index.d.ts +2 -0
  53. package/dist/neutral/index.d.ts.map +1 -1
  54. package/dist/neutral/index.mjs +509 -88
  55. package/dist/neutral/index.mjs.map +1 -1
  56. package/dist/neutral/payload/index.d.ts +1 -0
  57. package/dist/neutral/payload/index.d.ts.map +1 -1
  58. package/dist/neutral/payload/netTransfersForPayloads.d.ts +4 -0
  59. package/dist/neutral/payload/netTransfersForPayloads.d.ts.map +1 -0
  60. package/dist/neutral/steps/index.d.ts +2 -0
  61. package/dist/neutral/steps/index.d.ts.map +1 -0
  62. package/dist/neutral/steps/primitives/addressStakeWeight.d.ts +4 -0
  63. package/dist/neutral/steps/primitives/addressStakeWeight.d.ts.map +1 -0
  64. package/dist/neutral/steps/primitives/claimedRewards.d.ts +3 -0
  65. package/dist/neutral/steps/primitives/claimedRewards.d.ts.map +1 -0
  66. package/dist/neutral/steps/primitives/index.d.ts +17 -0
  67. package/dist/neutral/steps/primitives/index.d.ts.map +1 -0
  68. package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts +4 -0
  69. package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts.map +1 -0
  70. package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts +4 -0
  71. package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts.map +1 -0
  72. package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts +4 -0
  73. package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts.map +1 -0
  74. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts +4 -0
  75. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts.map +1 -0
  76. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts +4 -0
  77. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts.map +1 -0
  78. package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts +3 -0
  79. package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts.map +1 -0
  80. package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts +3 -0
  81. package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts.map +1 -0
  82. package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts +3 -0
  83. package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts.map +1 -0
  84. package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts +3 -0
  85. package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts.map +1 -0
  86. package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts +4 -0
  87. package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts.map +1 -0
  88. package/dist/neutral/steps/primitives/stakersAsOfBlock.d.ts +4 -0
  89. package/dist/neutral/steps/primitives/stakersAsOfBlock.d.ts.map +1 -0
  90. package/dist/neutral/steps/primitives/startingStakes.d.ts +4 -0
  91. package/dist/neutral/steps/primitives/startingStakes.d.ts.map +1 -0
  92. package/dist/neutral/steps/primitives/totalStakeWeight.d.ts +4 -0
  93. package/dist/neutral/steps/primitives/totalStakeWeight.d.ts.map +1 -0
  94. package/dist/neutral/steps/primitives/unclaimedRewards.d.ts +4 -0
  95. package/dist/neutral/steps/primitives/unclaimedRewards.d.ts.map +1 -0
  96. package/dist/neutral/time/index.d.ts +2 -0
  97. package/dist/neutral/time/index.d.ts.map +1 -0
  98. package/dist/neutral/time/primitives/index.d.ts +2 -0
  99. package/dist/neutral/time/primitives/index.d.ts.map +1 -0
  100. package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts +3 -0
  101. package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts.map +1 -0
  102. package/package.json +6 -5
  103. package/src/block/hydrate/allHashesPresent.ts +7 -0
  104. package/src/block/hydrate/blockPayloadsFromHydratedBlock.ts +11 -0
  105. package/src/block/hydrate/flattenHydratedBlock.ts +7 -0
  106. package/src/block/hydrate/flattenHydratedBlocks.ts +7 -0
  107. package/src/block/hydrate/hydrateBlock.ts +38 -0
  108. package/src/block/hydrate/index.ts +7 -0
  109. package/src/block/hydrate/transactionsFromHydratedBlock.ts +8 -0
  110. package/src/block/hydrate/tryHydrateBlock.ts +25 -0
  111. package/src/block/index.ts +1 -1
  112. package/src/block/primitives/{balanceStepSummaryFromRange.ts → balances/balancesStepSummaryFromRange.ts} +10 -10
  113. package/src/block/primitives/{balanceSummary.ts → balances/balancesSummary.ts} +6 -6
  114. package/src/block/primitives/balances/index.ts +2 -0
  115. package/src/block/primitives/blockFromBlockNumber.ts +33 -0
  116. package/src/block/primitives/hashFromBlockNumber.ts +3 -26
  117. package/src/block/primitives/index.ts +4 -3
  118. package/src/block/primitives/model.ts +7 -2
  119. package/src/block/primitives/{payloads.ts → payloads/BalancesStepSummary.ts} +4 -23
  120. package/src/block/primitives/payloads/ChainWindow.ts +6 -0
  121. package/src/block/primitives/payloads/StepSummary.ts +15 -0
  122. package/src/block/primitives/payloads/TransfersSummary.ts +30 -0
  123. package/src/block/primitives/payloads/index.ts +4 -0
  124. package/src/block/primitives/transfers/index.ts +2 -0
  125. package/src/block/primitives/transfers/transfersStepSummaryFromRange.ts +79 -0
  126. package/src/block/primitives/transfers/transfersSummary.ts +31 -0
  127. package/src/config/Producer.ts +17 -0
  128. package/src/index.ts +2 -0
  129. package/src/payload/index.ts +1 -0
  130. package/src/payload/netTransfersForPayloads.ts +30 -0
  131. package/src/steps/index.ts +1 -0
  132. package/src/steps/primitives/addressStakeWeight.ts +51 -0
  133. package/src/steps/primitives/claimedRewards.ts +5 -0
  134. package/src/steps/primitives/index.ts +16 -0
  135. package/src/steps/primitives/networkStakeStepAddressReward.ts +6 -0
  136. package/src/steps/primitives/networkStakeStepPoolRewardShares.ts +6 -0
  137. package/src/steps/primitives/networkStakeStepPoolRewards.ts +6 -0
  138. package/src/steps/primitives/networkStakeStepRewardAddressHistory.ts +6 -0
  139. package/src/steps/primitives/networkStakeStepRewardAddressShare.ts +6 -0
  140. package/src/steps/primitives/networkStakeStepRewardForStep.ts +5 -0
  141. package/src/steps/primitives/networkStakeStepRewardPositionWeight.ts +5 -0
  142. package/src/steps/primitives/networkStakeStepRewardPotentialPositionLoss.ts +5 -0
  143. package/src/steps/primitives/networkStakeStepRewardRandomizer.ts +5 -0
  144. package/src/steps/primitives/networkStakeStepRewardWeightForAddress.ts +6 -0
  145. package/src/steps/primitives/stakersAsOfBlock.ts +18 -0
  146. package/src/steps/primitives/startingStakes.ts +30 -0
  147. package/src/steps/primitives/totalStakeWeight.ts +35 -0
  148. package/src/steps/primitives/unclaimedRewards.ts +6 -0
  149. package/src/time/index.ts +1 -0
  150. package/src/time/primitives/index.ts +1 -0
  151. package/src/time/primitives/xl1BlockNumberToEthBlockNumber.ts +13 -0
  152. package/dist/neutral/block/hydrateBlock.d.ts +0 -12
  153. package/dist/neutral/block/hydrateBlock.d.ts.map +0 -1
  154. package/dist/neutral/block/primitives/balanceStepSummaryFromRange.d.ts +0 -6
  155. package/dist/neutral/block/primitives/balanceStepSummaryFromRange.d.ts.map +0 -1
  156. package/dist/neutral/block/primitives/balanceSummary.d.ts +0 -4
  157. package/dist/neutral/block/primitives/balanceSummary.d.ts.map +0 -1
  158. package/dist/neutral/block/primitives/payloads.d.ts.map +0 -1
  159. package/src/block/hydrateBlock.ts +0 -84
@@ -0,0 +1,79 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { type Address } from '@xylabs/hex'
3
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
4
+ import type { WithStorageMeta } from '@xyo-network/payload-model'
5
+ import { isAnyPayload } from '@xyo-network/payload-model'
6
+ import { StepSizes } from '@xyo-network/xl1-protocol'
7
+
8
+ import { netTransfersForPayloads } from '../../../payload/index.ts'
9
+ import {
10
+ parseSignedBigInt, type SignedBigInt, toSignedBigInt,
11
+ } from '../../../SignedBigInt.ts'
12
+ import { hydrateBlock } from '../../hydrate/index.ts'
13
+ import { type BlockNumberRange, deepCalculateFramesFromRange } from '../frames/index.ts'
14
+ import { hashFromBlockNumber } from '../hashFromBlockNumber.ts'
15
+ import type { TransfersStepSummaryContext } from '../model.ts'
16
+ import { type TransfersStepSummary, TransfersStepSummarySchema } from '../payloads/index.ts'
17
+
18
+ export async function transfersStepSummaryFromRange(
19
+ context: TransfersStepSummaryContext,
20
+ range: BlockNumberRange,
21
+ ): Promise<WithStorageMeta<TransfersStepSummary>> {
22
+ // console.log(`transfersStepSummaryFromRange: head=${head}, range=${range[0]}-${range[1]}`)
23
+ const frameHeadHash = await hashFromBlockNumber(context, range[1])
24
+ const frameSize = range[1] - range[0] + 1
25
+ const { account } = context
26
+
27
+ let result: TransfersStepSummary | undefined = undefined
28
+
29
+ if (frameSize === 1) {
30
+ const hash = await hashFromBlockNumber(context, range[0])
31
+ const [, payloads] = await hydrateBlock(context.chainArchivist, hash)
32
+ const transfers: Record<Address, SignedBigInt> = {}
33
+ for (const [address, balance] of Object.entries(netTransfersForPayloads(payloads, account))) {
34
+ transfers[address as Address] = toSignedBigInt(balance)
35
+ }
36
+ result = {
37
+ schema: TransfersStepSummarySchema, hash: context.head, stepSize: -1, transfers, account,
38
+ }
39
+ } else {
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
+ const step = (StepSizes as any).indexOf(frameSize)
42
+ assertEx(step !== -1, () => `Invalid step size: ${frameSize}. Must be one of ${StepSizes.join(', ')}`)
43
+
44
+ const [summaryResult] = await context.summaryRepository.get([frameHeadHash])
45
+ if (isAnyPayload(summaryResult)) {
46
+ result = summaryResult as WithStorageMeta<TransfersStepSummary>
47
+ } else {
48
+ // We do not have it, so lets build it
49
+ const subRanges = deepCalculateFramesFromRange(range, step - 1)
50
+ const promises = subRanges.map(subRange => transfersStepSummaryFromRange(
51
+ context,
52
+ subRange,
53
+ ))
54
+ const subResults = await Promise.all(promises)
55
+
56
+ // add them all up
57
+ const bigIntBalances: Record<Address, bigint> = {}
58
+ for (const subResult of subResults) {
59
+ for (const [address, transfer] of Object.entries(subResult.transfers)) {
60
+ bigIntBalances[address as Address] = (bigIntBalances[address as Address] ?? 0n) + parseSignedBigInt(transfer)
61
+ }
62
+ }
63
+
64
+ const transfers: Record<Address, SignedBigInt> = {}
65
+ for (const [address, transfer] of Object.entries(bigIntBalances)) {
66
+ transfers[address as Address] = toSignedBigInt(transfer)
67
+ }
68
+
69
+ result = {
70
+ schema: TransfersStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, transfers, account,
71
+ }
72
+
73
+ await context.summaryRepository.insert([result])
74
+ }
75
+ }
76
+ // console.log(`transfersStepSummaryFromRange-result: head=${head}, range=${range[0]}-${range[1]}: ${toSafeJsonString(result, 10)}`)
77
+ const finalResult = await PayloadBuilder.addStorageMeta(result)
78
+ return finalResult
79
+ }
@@ -0,0 +1,31 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import { asAddress } from '@xylabs/hex'
3
+ import { spanRootAsync } from '@xylabs/telemetry'
4
+ import { isDefined } from '@xylabs/typeof'
5
+ import { asBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'
6
+
7
+ import { parseSignedBigInt } from '../../../SignedBigInt.ts'
8
+ import { deepCalculateFramesFromRange } from '../frames/index.ts'
9
+ import type { TransfersStepSummaryContext } from '../model.ts'
10
+ import { transfersStepSummaryFromRange } from './transfersStepSummaryFromRange.ts'
11
+
12
+ // the summary of amount of rewards claimed from the step reward pool by addresses
13
+ export async function transfersSummary(
14
+ context: TransfersStepSummaryContext,
15
+ ): Promise<Partial<Record<Address, bigint>>> {
16
+ return await spanRootAsync('transferSummary', async () => {
17
+ const headResult = await context.chainArchivist.get([context.head])
18
+ const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult.at(0), () => `Head block not found for hash: ${context.head}`, { required: true })
19
+ const rangeStart = isDefined(context.windowSize) ? Math.max(headBoundWitness.block - context.windowSize + 1, 0) : 0
20
+ const ranges = deepCalculateFramesFromRange([rangeStart, headBoundWitness.block])
21
+ const summaries = await Promise.all(ranges.map(range => transfersStepSummaryFromRange(context, range)))
22
+ const transfers: Partial<Record<Address, bigint>> = {}
23
+ for (let summary of summaries) {
24
+ for (const [address, transfer] of Object.entries(summary.transfers)) {
25
+ const validAddress = asAddress(address, () => `Invalid address: ${address}`)
26
+ transfers[validAddress] = (transfers[validAddress] ?? 0n) + parseSignedBigInt(transfer)
27
+ }
28
+ }
29
+ return transfers
30
+ })
31
+ }
@@ -1,9 +1,21 @@
1
+ import { AddressZod, asAddress } from '@xylabs/hex'
1
2
  import { globalRegistry } from 'zod'
2
3
  import * as z from 'zod'
3
4
 
4
5
  import { MnemonicStringZod } from '../validation/index.ts'
5
6
 
6
7
  export const ProducerConfigZod = z.object({
8
+ allowlist: z.preprocess((val) => {
9
+ if (typeof val === 'string') {
10
+ return val.split(',').map(s => asAddress(s.trim()))
11
+ }
12
+ return val
13
+ }, z.array(AddressZod).optional().register(globalRegistry, {
14
+ description: 'List of allowed producer addresses, if undefined anyone can participate',
15
+ title: 'allowlist',
16
+ type: 'array',
17
+ })),
18
+
7
19
  disableIntentRedeclaration: z.boolean().optional().register(globalRegistry, {
8
20
  description: 'Should the producer skip redeclaring their intent to continue producing blocks',
9
21
  title: 'producer.disableIntentRedeclaration',
@@ -15,6 +27,11 @@ export const ProducerConfigZod = z.object({
15
27
  title: 'producer.healthCheckPort',
16
28
  type: 'number',
17
29
  }),
30
+ heartbeatInterval: z.coerce.number().default(3_600_000).register(globalRegistry, {
31
+ description: 'The number of milliseconds between heartbeats if no blocks are produced',
32
+ title: 'producer.heartbeatInterval',
33
+ type: 'number',
34
+ }),
18
35
  // TODO: BigInt schema
19
36
  minStake: z.coerce.number().default(1).register(globalRegistry, {
20
37
  description: 'Minimum stake required to be a Producer',
package/src/index.ts CHANGED
@@ -5,6 +5,8 @@ export * from './config/index.ts'
5
5
  export * from './instances/index.ts'
6
6
  export * from './payload/index.ts'
7
7
  export * from './SignedBigInt.ts'
8
+ export * from './steps/index.ts'
9
+ export * from './time/index.ts'
8
10
  export * from './transaction/index.ts'
9
11
  export * from './validation/index.ts'
10
12
  export * from './wallet/index.ts'
@@ -1 +1,2 @@
1
1
  export * from './netBalancesForPayloads.ts'
2
+ export * from './netTransfersForPayloads.ts'
@@ -0,0 +1,30 @@
1
+ import {
2
+ type Address, type Hex, hexToBigInt,
3
+ } from '@xylabs/hex'
4
+ import { span } from '@xylabs/telemetry'
5
+ import type { Payload } from '@xyo-network/payload-model'
6
+ import { isTransfer } from '@xyo-network/xl1-protocol'
7
+
8
+ // the net transfer amounts for the specified accounts only
9
+ export function netTransfersForPayloads(payloads: Payload[], account: Address): Record<Address, bigint> {
10
+ return span('netTransfersForPayloads', () => {
11
+ const transfers: Record<Address, bigint> = {}
12
+ for (const payload of payloads) {
13
+ if (isTransfer(payload)) {
14
+ const { from } = payload
15
+ for (let [address, amount] of Object.entries(payload.transfers) as [Address, Hex][]) {
16
+ if (account === from) {
17
+ if (address !== from) {
18
+ transfers[address] = (transfers[address] ?? 0n) + hexToBigInt(amount)
19
+ }
20
+ } else {
21
+ if (account === address) {
22
+ transfers[from] = (transfers[from] ?? 0n) - hexToBigInt(amount)
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ return transfers
29
+ })
30
+ }
@@ -0,0 +1 @@
1
+ export * from './primitives/index.ts'
@@ -0,0 +1,51 @@
1
+ import { type Address, toAddress } from '@xylabs/hex'
2
+ import type { AddressStakingV2 } from '@xyo-network/typechain'
3
+ import { XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-protocol'
4
+
5
+ export async function addressStakeWeight(
6
+ stakeContract: AddressStakingV2,
7
+ staked: Address,
8
+ by: Address,
9
+ startEthBlock: number,
10
+ endEthBlock: number,
11
+ ): Promise<bigint> {
12
+ const stakeAddedFilter = stakeContract.filters.StakeAdded(`0x${XYO_NETWORK_STAKING_ADDRESS}`, by)
13
+ const stakeAddedEvents = await stakeContract.queryFilter(stakeAddedFilter, startEthBlock, endEthBlock)
14
+
15
+ const stakeRemovedFilter = stakeContract.filters.StakeRemoved(`0x${XYO_NETWORK_STAKING_ADDRESS}`, by)
16
+ const stakeRemovedEvents = await stakeContract.queryFilter(stakeRemovedFilter, startEthBlock, endEthBlock)
17
+
18
+ const accountStakes: Awaited<ReturnType<typeof stakeContract.getStake>> [] = []
19
+ const accountStakeCount = await stakeContract.getStakeCountForAddress(`0x${by}`, { blockTag: startEthBlock - 1 })
20
+ for (let i = 0; i < accountStakeCount; i++) {
21
+ try {
22
+ const stake = await stakeContract.getStake(`0x${by}`, i, { blockTag: startEthBlock - 1 })
23
+ accountStakes.push(stake)
24
+ } catch {
25
+ break
26
+ }
27
+ }
28
+ const ethStakedAddress = toAddress(staked, { prefix: false }).toLowerCase()
29
+ const networkStakes = accountStakes.filter(s => s.staked.toLowerCase() === ethStakedAddress)
30
+ let totalStake = 0n
31
+ for (const stake of networkStakes) {
32
+ totalStake += stake.amount
33
+ }
34
+ let totalWeight = 0n
35
+ let addIndex = 0
36
+ let removeIndex = 0
37
+
38
+ // add up all the stakes for each block
39
+ for (let i = startEthBlock; i <= endEthBlock; i++) {
40
+ while (addIndex < stakeAddedEvents.length && stakeAddedEvents[addIndex]?.blockNumber === i) {
41
+ totalStake += stakeAddedEvents[addIndex].args.amount
42
+ addIndex++
43
+ }
44
+ while (removeIndex < stakeRemovedEvents.length && stakeRemovedEvents[removeIndex]?.blockNumber === i) {
45
+ totalStake -= stakeRemovedEvents[removeIndex].args.amount
46
+ removeIndex++
47
+ }
48
+ totalWeight += totalStake
49
+ }
50
+ return totalWeight
51
+ }
@@ -0,0 +1,5 @@
1
+ import type { Address } from '@xylabs/hex'
2
+
3
+ export function claimedRewards(_address: Address) {
4
+ return 0n
5
+ }
@@ -0,0 +1,16 @@
1
+ export * from './addressStakeWeight.ts'
2
+ export * from './claimedRewards.ts'
3
+ export * from './networkStakeStepAddressReward.ts'
4
+ export * from './networkStakeStepPoolRewards.ts'
5
+ export * from './networkStakeStepPoolRewardShares.ts'
6
+ export * from './networkStakeStepRewardAddressHistory.ts'
7
+ export * from './networkStakeStepRewardAddressShare.ts'
8
+ export * from './networkStakeStepRewardForStep.ts'
9
+ export * from './networkStakeStepRewardPositionWeight.ts'
10
+ export * from './networkStakeStepRewardPotentialPositionLoss.ts'
11
+ export * from './networkStakeStepRewardRandomizer.ts'
12
+ export * from './networkStakeStepRewardWeightForAddress.ts'
13
+ export * from './stakersAsOfBlock.ts'
14
+ export * from './startingStakes.ts'
15
+ export * from './totalStakeWeight.ts'
16
+ export * from './unclaimedRewards.ts'
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepAddressReward(address: Address, step: number, block: number): Promisable<Record<Address, bigint>> {
5
+ return { [address]: 0n }
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepPoolRewardShares(step: number, block: number): Promisable<Record<Address, bigint>> {
5
+ return {}
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepPoolRewards(step: number, block: number): Promisable<Record<Address, bigint>> {
5
+ return {}
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepRewardAddressHistory(address: Address): Promisable<Record<Address, bigint>> {
5
+ return { [address]: 0n }
6
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepRewardAddressShare(address: Address, step: number, block: number): Promisable<[bigint, bigint]> {
5
+ throw new Error('Method not implemented.')
6
+ }
@@ -0,0 +1,5 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+
3
+ export function networkStakeStepRewardForStep(step: number): Promisable<bigint> {
4
+ return 0n
5
+ }
@@ -0,0 +1,5 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+
3
+ export function networkStakeStepRewardPositionWeight(position: bigint, step: number): Promisable<number> {
4
+ throw new Error('Method not implemented.')
5
+ }
@@ -0,0 +1,5 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+
3
+ export function networkStakeStepRewardPotentialPositionLoss(position: bigint, step: number): Promisable<bigint> {
4
+ throw new Error('Method not implemented.')
5
+ }
@@ -0,0 +1,5 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+
3
+ export function networkStakeStepRewardRandomizer(step: number, block: number): Promisable<bigint> {
4
+ throw new Error('Method not implemented.')
5
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function networkStakeStepRewardWeightForAddress(address: Address, step: number): Promisable<bigint> {
5
+ throw new Error('Method not implemented.')
6
+ }
@@ -0,0 +1,18 @@
1
+ import { type Address, toAddress } from '@xylabs/hex'
2
+ import type { AddressStakingV2 } from '@xyo-network/typechain'
3
+
4
+ import { startingStakes } from './startingStakes.ts'
5
+
6
+ // NOTE: Do not use the functions in this file yet, they still need to be tested
7
+
8
+ export async function stakersAsOfBlock(stakeContract: AddressStakingV2, staked: Address, ethBlock: number): Promise<Address[]> {
9
+ const stakes = await startingStakes(stakeContract, staked, ethBlock)
10
+ let results: Address[] = []
11
+ for (const [address, amount] of Object.entries(stakes)) {
12
+ if (amount > 0n) {
13
+ results.push(toAddress(address, { prefix: false }))
14
+ }
15
+ }
16
+
17
+ return results
18
+ }
@@ -0,0 +1,30 @@
1
+ import { type Address, toAddress } from '@xylabs/hex'
2
+ import type { AddressStakingV2 } from '@xyo-network/typechain'
3
+ import { XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-protocol'
4
+
5
+ export async function startingStakes(stakeContract: AddressStakingV2, staked: Address, ethBlock: number): Promise<Record<Address, bigint>> {
6
+ const stakeAddedFilter = stakeContract.filters.StakeAdded(toAddress(XYO_NETWORK_STAKING_ADDRESS, { prefix: true }))
7
+ const stakeAddedEvents = await stakeContract.queryFilter(stakeAddedFilter, 0, ethBlock)
8
+
9
+ const stakeRemovedFilter = stakeContract.filters.StakeRemoved(`0x${XYO_NETWORK_STAKING_ADDRESS}`)
10
+ const stakeRemovedEvents = await stakeContract.queryFilter(stakeRemovedFilter, 0, ethBlock)
11
+
12
+ const stakes: Record<Address, bigint> = {}
13
+ for (const event of stakeAddedEvents) {
14
+ const by = toAddress(event.args.by.toLowerCase(), { prefix: false })
15
+ stakes[by] = (stakes[by] ?? 0n) + event.args.amount
16
+ }
17
+ for (const event of stakeRemovedEvents) {
18
+ const by = toAddress(event.args.by.toLowerCase(), { prefix: false })
19
+ stakes[by] = (stakes[by] ?? 0n) - event.args.amount
20
+ }
21
+
22
+ const filteredStakes: Record<Address, bigint> = {}
23
+ for (const [address, amount] of Object.entries(stakes) as [Address, bigint][]) {
24
+ if (amount > 0n) {
25
+ filteredStakes[address] = amount
26
+ }
27
+ }
28
+
29
+ return filteredStakes
30
+ }
@@ -0,0 +1,35 @@
1
+ import { type Address, toAddress } from '@xylabs/hex'
2
+ import type { AddressStakingV2 } from '@xyo-network/typechain'
3
+ import { XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-protocol'
4
+
5
+ import { startingStakes } from './startingStakes.ts'
6
+
7
+ export async function totalStakeWeight(stakeContract: AddressStakingV2, staked: Address, startEthBlock: number, endEthBlock: number): Promise<bigint> {
8
+ const stakeAddedFilter = stakeContract.filters.StakeAdded(`0x${XYO_NETWORK_STAKING_ADDRESS}`)
9
+ const stakeAddedEvents = await stakeContract.queryFilter(stakeAddedFilter, startEthBlock, endEthBlock)
10
+
11
+ const stakeRemovedFilter = stakeContract.filters.StakeRemoved(`0x${XYO_NETWORK_STAKING_ADDRESS}`)
12
+ const stakeRemovedEvents = await stakeContract.queryFilter(stakeRemovedFilter, startEthBlock, endEthBlock)
13
+
14
+ const stakes = await startingStakes(stakeContract, staked, startEthBlock)
15
+
16
+ let totalWeight = 0n
17
+ let addIndex = 0
18
+ let removeIndex = 0
19
+
20
+ // add up all the stakes for each block
21
+ for (let i = startEthBlock; i <= endEthBlock; i++) {
22
+ while (addIndex < stakeAddedEvents.length && stakeAddedEvents[addIndex]?.blockNumber === i) {
23
+ const by = toAddress(stakeAddedEvents[addIndex].args.by.toLowerCase(), { prefix: false })
24
+ stakes[by] = (stakes[by] ?? 0n) + stakeAddedEvents[addIndex].args.amount
25
+ addIndex++
26
+ }
27
+ while (removeIndex < stakeRemovedEvents.length && stakeRemovedEvents[removeIndex]?.blockNumber === i) {
28
+ const by = toAddress(stakeAddedEvents[addIndex].args.by.toLowerCase(), { prefix: false })
29
+ stakes[by] = (stakes[by] ?? 0n) - stakeRemovedEvents[addIndex].args.amount
30
+ removeIndex++
31
+ }
32
+ totalWeight += Object.values(stakes).reduce((a, b) => a + b, 0n)
33
+ }
34
+ return totalWeight
35
+ }
@@ -0,0 +1,6 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export function unclaimedRewards(address: Address): Promisable<bigint> {
5
+ throw new Error('Method not implemented.')
6
+ }
@@ -0,0 +1 @@
1
+ export * from './primitives/index.ts'
@@ -0,0 +1 @@
1
+ export * from './xl1BlockNumberToEthBlockNumber.ts'
@@ -0,0 +1,13 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { asTimePayload, TimeSchema } from '@xyo-network/xl1-protocol'
3
+
4
+ import {
5
+ type ChainContext, hashFromBlockNumber, hydrateBlock,
6
+ } from '../../block/index.ts'
7
+
8
+ export async function xl1BlockNumberToEthBlockNumber(context: ChainContext, xl1BlockNumber: number): Promise<number> {
9
+ const blockHash = await hashFromBlockNumber(context, xl1BlockNumber)
10
+ const hydratedBlock = await hydrateBlock(context.chainArchivist, blockHash)
11
+ const timePayload = asTimePayload(hydratedBlock[1].find(p => p.schema === TimeSchema), { required: true })
12
+ return assertEx(timePayload.ethereum, () => 'No ethereum timestamp found on block')
13
+ }
@@ -1,12 +0,0 @@
1
- import type { Hash } from '@xylabs/hex';
2
- import type { ReadArchivist } from '@xyo-network/archivist-model';
3
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model';
4
- import type { HydratedBlock, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
5
- export declare function allHashesPresent(hashes: Hash[], payloads: WithStorageMeta<Payload>[]): boolean;
6
- export declare const tryHydrateBlock: (archivist: ReadArchivist, hash: Hash, maxDepth?: number) => Promise<HydratedBlock | undefined>;
7
- export declare const hydrateBlock: (archivist: ReadArchivist, hash: Hash, maxDepth?: number, minDepth?: number) => Promise<HydratedBlock>;
8
- export declare const flattenHydratedBlock: (hydratedBlock: HydratedBlock) => WithStorageMeta<Payload>[];
9
- export declare const flattenHydratedBlocks: (hydratedBlocks: HydratedBlock[]) => WithStorageMeta<Payload>[];
10
- export declare const transactionsFromHydratedBlock: (block: HydratedBlock) => WithStorageMeta<TransactionBoundWitness>[];
11
- export declare const blockPayloadsFromHydratedBlock: (block: HydratedBlock) => WithStorageMeta<Payload>[];
12
- //# sourceMappingURL=hydrateBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hydrateBlock.d.ts","sourceRoot":"","sources":["../../../src/block/hydrateBlock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAKvF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAG9F;AAED,eAAO,MAAM,eAAe,GAC1B,WAAW,aAAa,EACxB,MAAM,IAAI,EACV,WAAU,MAAU,KACnB,OAAO,CAAC,aAAa,GAAG,SAAS,CAcnC,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,WAAW,aAAa,EACxB,MAAM,IAAI,EACV,WAAU,MAAU,EACpB,iBAAmB,KAClB,OAAO,CAAC,aAAa,CAwBvB,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,eAAe,aAAa,KAAG,eAAe,CAAC,OAAO,CAAC,EAG3F,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,gBAAgB,aAAa,EAAE,KAAG,eAAe,CAAC,OAAO,CAAC,EACtC,CAAA;AAE1D,eAAO,MAAM,6BAA6B,GAAI,OAAO,aAAa,KAAG,eAAe,CAAC,uBAAuB,CAAC,EAE5G,CAAA;AAED,eAAO,MAAM,8BAA8B,GAAI,OAAO,aAAa,KAAG,eAAe,CAAC,OAAO,CAAC,EAK7F,CAAA"}
@@ -1,6 +0,0 @@
1
- import type { WithStorageMeta } from '@xyo-network/payload-model';
2
- import type { BlockNumberRange } from './frames/index.ts';
3
- import type { BalanceStepSummaryContext } from './model.ts';
4
- import { type BalancesStepSummary } from './payloads.ts';
5
- export declare function balanceStepSummaryFromRange(context: BalanceStepSummaryContext, range: BlockNumberRange): Promise<WithStorageMeta<BalancesStepSummary>>;
6
- //# sourceMappingURL=balanceStepSummaryFromRange.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"balanceStepSummaryFromRange.d.ts","sourceRoot":"","sources":["../../../../src/block/primitives/balanceStepSummaryFromRange.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AASjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,eAAe,CAAA;AAEnF,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAyD/C"}
@@ -1,4 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- import type { BalanceStepSummaryContext } from './model.ts';
3
- export declare function balanceSummary(context: BalanceStepSummaryContext): Promise<Partial<Record<Address, bigint>>>;
4
- //# sourceMappingURL=balanceSummary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"balanceSummary.d.ts","sourceRoot":"","sources":["../../../../src/block/primitives/balanceSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAS1C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAE3D,wBAAsB,cAAc,CAClC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAgB3C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"payloads.d.ts","sourceRoot":"","sources":["../../../../src/block/primitives/payloads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,KAAK,EACV,OAAO,EAAE,MAAM,EAAE,eAAe,EACjC,MAAM,4BAA4B,CAAA;AAGnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,eAAO,MAAM,iBAAiB,EAAE,MAAmC,CAAA;AACnE,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,IAAI,CAAA;CACX;AAED,MAAM,MAAM,WAAW,CAAC,iBAAiB,SAAS,WAAW,GAAG,IAAI,GAAG,IAAI,EACzE,OAAO,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,iBAAiB,SAAS,IAAI,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,EACxI,OAAO,SAAS,IAAI,GAAG,iBAAiB,GAAG,OAAO,CAAC,CAAA;AAEvD,eAAO,MAAM,yBAAyB,EAAE,MAA4C,CAAA;AACpF,MAAM,MAAM,yBAAyB,GAAG,OAAO,yBAAyB,CAAA;AAExE,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;CACxC,EAAE,yBAAyB,CAAC,CAAA;AAE7B;;GAEG;AACH,eAAO,MAAM,qBAAqB,kDAAwE,CAAA;AAC1G,eAAO,MAAM,qBAAqB,8DAAqE,CAAA;AAEvG;;GAEG;AACH,eAAO,MAAM,oCAAoC,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,eAAe,CAAC,mBAAmB,CAEjH,CAAA;AACD,eAAO,MAAM,oCAAoC,+EAAqG,CAAA"}
@@ -1,84 +0,0 @@
1
- import { filterAs } from '@xylabs/array'
2
- import { assertEx } from '@xylabs/assert'
3
- import type { Hash } from '@xylabs/hex'
4
- import type { ReadArchivist } from '@xyo-network/archivist-model'
5
- import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
6
- import type { HydratedBlock, TransactionBoundWitness } from '@xyo-network/xl1-protocol'
7
- import {
8
- asTransactionBoundWitnessWithStorageMeta, isBlockBoundWitnessWithStorageMeta, isTransactionBoundWitnessWithStorageMeta,
9
- } from '@xyo-network/xl1-protocol'
10
-
11
- export function allHashesPresent(hashes: Hash[], payloads: WithStorageMeta<Payload>[]): boolean {
12
- const payloadHashes = new Set(payloads.map(p => p._hash))
13
- return hashes.every(hash => payloadHashes.has(hash))
14
- }
15
-
16
- export const tryHydrateBlock = async (
17
- archivist: ReadArchivist,
18
- hash: Hash,
19
- maxDepth: number = 1,
20
- ): Promise<HydratedBlock | undefined> => {
21
- assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')
22
- const bw = (await archivist.get([hash])).find(isBlockBoundWitnessWithStorageMeta)
23
- if (!bw) return undefined
24
- if (maxDepth === 0) return [bw, []]
25
- const blkPayloads = await archivist.get(bw.payload_hashes)
26
- if (maxDepth === 1) return [bw, blkPayloads]
27
- const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)
28
- const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)
29
- const transactionsPayloads = await archivist.get(transactionsPayloadHashes)
30
- const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))
31
- const allPayloads = await archivist.get([...allPayloadsHashes])
32
- const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))
33
- return [bw, allPayloadsFiltered]
34
- }
35
-
36
- export const hydrateBlock = async (
37
- archivist: ReadArchivist,
38
- hash: Hash,
39
- maxDepth: number = 1,
40
- minDepth = maxDepth,
41
- ): Promise<HydratedBlock> => {
42
- assertEx(maxDepth >= 0, () => 'maxDepth must be greater than or equal to 0')
43
- assertEx(minDepth >= 0, () => 'minDepth must be greater than or equal to 0')
44
- assertEx(maxDepth >= minDepth, () => 'maxDepth must be greater than or equal to minDepth')
45
- const bw = assertEx(
46
- (await archivist.get([hash])).find(isBlockBoundWitnessWithStorageMeta),
47
- () => `block ${hash} not found`,
48
- )
49
- if (maxDepth === 0) return [bw, []]
50
- const blkPayloads = await archivist.get(bw.payload_hashes)
51
- if (minDepth === 1) assertEx(allHashesPresent(bw.payload_hashes, blkPayloads), () => `Unable to find all payloads for block ${hash}`)
52
- if (maxDepth === 1) return [bw, blkPayloads]
53
- const transactions = blkPayloads.filter(isTransactionBoundWitnessWithStorageMeta)
54
- const transactionsPayloadHashes = transactions.flatMap(tx => tx.payload_hashes)
55
- const transactionsPayloads = await archivist.get(transactionsPayloadHashes)
56
- assertEx(allHashesPresent(transactionsPayloadHashes, transactionsPayloads), () => `Unable to find all payloads for transactions in block ${hash}`)
57
- const allPayloadsHashes = new Set([...blkPayloads, ...transactionsPayloads].flatMap(p => p._hash))
58
- const allPayloads = await archivist.get([...allPayloadsHashes])
59
- const allPayloadsFiltered = allPayloads.filter(p => allPayloadsHashes.has(p._hash))
60
- if (maxDepth === 2) assertEx(allHashesPresent(
61
- [...allPayloadsHashes],
62
- allPayloadsFiltered,
63
- ), () => `Unable to find all payloads for transactions in block ${hash}`)
64
- return [bw, allPayloadsFiltered]
65
- }
66
-
67
- export const flattenHydratedBlock = (hydratedBlock: HydratedBlock): WithStorageMeta<Payload>[] => {
68
- const [blk, blkPayloads] = hydratedBlock
69
- return [...blkPayloads, blk]
70
- }
71
-
72
- export const flattenHydratedBlocks = (hydratedBlocks: HydratedBlock[]): WithStorageMeta<Payload>[] =>
73
- hydratedBlocks.flatMap(blk => flattenHydratedBlock(blk))
74
-
75
- export const transactionsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<TransactionBoundWitness>[] => {
76
- return filterAs(block[1], asTransactionBoundWitnessWithStorageMeta)
77
- }
78
-
79
- export const blockPayloadsFromHydratedBlock = (block: HydratedBlock): WithStorageMeta<Payload>[] => {
80
- return block[0].payload_hashes.map(hash => assertEx(
81
- block[1].find(p => p._hash === hash),
82
- () => `missing payload ${hash}`,
83
- )).filter(x => !isTransactionBoundWitnessWithStorageMeta(x))
84
- }