@xyo-network/xl1-protocol-sdk 1.14.4 → 1.15.1
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.
- package/dist/neutral/block/hydrate/allHashesPresent.d.ts +4 -0
- package/dist/neutral/block/hydrate/allHashesPresent.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/blockPayloadsFromHydratedBlock.d.ts +4 -0
- package/dist/neutral/block/hydrate/blockPayloadsFromHydratedBlock.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/flattenHydratedBlock.d.ts +4 -0
- package/dist/neutral/block/hydrate/flattenHydratedBlock.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/flattenHydratedBlocks.d.ts +4 -0
- package/dist/neutral/block/hydrate/flattenHydratedBlocks.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts +5 -0
- package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/index.d.ts +8 -0
- package/dist/neutral/block/hydrate/index.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/transactionsFromHydratedBlock.d.ts +4 -0
- package/dist/neutral/block/hydrate/transactionsFromHydratedBlock.d.ts.map +1 -0
- package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts +5 -0
- package/dist/neutral/block/hydrate/tryHydrateBlock.d.ts.map +1 -0
- package/dist/neutral/block/index.d.ts +1 -1
- package/dist/neutral/block/index.d.ts.map +1 -1
- package/dist/neutral/block/primitives/balances/balancesStepSummaryFromRange.d.ts +6 -0
- package/dist/neutral/block/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -0
- package/dist/neutral/block/primitives/balances/balancesSummary.d.ts +4 -0
- package/dist/neutral/block/primitives/balances/balancesSummary.d.ts.map +1 -0
- package/dist/neutral/block/primitives/balances/index.d.ts +3 -0
- package/dist/neutral/block/primitives/balances/index.d.ts.map +1 -0
- package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts +5 -0
- package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts.map +1 -0
- package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
- package/dist/neutral/block/primitives/index.d.ts +4 -3
- package/dist/neutral/block/primitives/index.d.ts.map +1 -1
- package/dist/neutral/block/primitives/model.d.ts +5 -2
- package/dist/neutral/block/primitives/model.d.ts.map +1 -1
- package/dist/neutral/block/primitives/{payloads.d.ts → payloads/BalancesStepSummary.d.ts} +5 -16
- package/dist/neutral/block/primitives/payloads/BalancesStepSummary.d.ts.map +1 -0
- package/dist/neutral/block/primitives/payloads/ChainWindow.d.ts +6 -0
- package/dist/neutral/block/primitives/payloads/ChainWindow.d.ts.map +1 -0
- package/dist/neutral/block/primitives/payloads/StepSummary.d.ts +11 -0
- package/dist/neutral/block/primitives/payloads/StepSummary.d.ts.map +1 -0
- package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts +21 -0
- package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts.map +1 -0
- package/dist/neutral/block/primitives/payloads/index.d.ts +5 -0
- package/dist/neutral/block/primitives/payloads/index.d.ts.map +1 -0
- package/dist/neutral/block/primitives/transfers/index.d.ts +3 -0
- package/dist/neutral/block/primitives/transfers/index.d.ts.map +1 -0
- package/dist/neutral/block/primitives/transfers/transfersStepSummaryFromRange.d.ts +6 -0
- package/dist/neutral/block/primitives/transfers/transfersStepSummaryFromRange.d.ts.map +1 -0
- package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts +4 -0
- package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts.map +1 -0
- package/dist/neutral/config/Config.d.ts +10 -0
- package/dist/neutral/config/Config.d.ts.map +1 -1
- package/dist/neutral/config/Producer.d.ts +10 -0
- package/dist/neutral/config/Producer.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +2 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +509 -88
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/neutral/payload/index.d.ts +1 -0
- package/dist/neutral/payload/index.d.ts.map +1 -1
- package/dist/neutral/payload/netTransfersForPayloads.d.ts +4 -0
- package/dist/neutral/payload/netTransfersForPayloads.d.ts.map +1 -0
- package/dist/neutral/steps/index.d.ts +2 -0
- package/dist/neutral/steps/index.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/addressStakeWeight.d.ts +4 -0
- package/dist/neutral/steps/primitives/addressStakeWeight.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/claimedRewards.d.ts +3 -0
- package/dist/neutral/steps/primitives/claimedRewards.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/index.d.ts +17 -0
- package/dist/neutral/steps/primitives/index.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts +3 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts +3 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts +3 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts +3 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts +4 -0
- package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/stakersAsOfBlock.d.ts +4 -0
- package/dist/neutral/steps/primitives/stakersAsOfBlock.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/startingStakes.d.ts +4 -0
- package/dist/neutral/steps/primitives/startingStakes.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/totalStakeWeight.d.ts +4 -0
- package/dist/neutral/steps/primitives/totalStakeWeight.d.ts.map +1 -0
- package/dist/neutral/steps/primitives/unclaimedRewards.d.ts +4 -0
- package/dist/neutral/steps/primitives/unclaimedRewards.d.ts.map +1 -0
- package/dist/neutral/time/index.d.ts +2 -0
- package/dist/neutral/time/index.d.ts.map +1 -0
- package/dist/neutral/time/primitives/index.d.ts +2 -0
- package/dist/neutral/time/primitives/index.d.ts.map +1 -0
- package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts +3 -0
- package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts.map +1 -0
- package/package.json +6 -5
- package/src/block/hydrate/allHashesPresent.ts +7 -0
- package/src/block/hydrate/blockPayloadsFromHydratedBlock.ts +11 -0
- package/src/block/hydrate/flattenHydratedBlock.ts +7 -0
- package/src/block/hydrate/flattenHydratedBlocks.ts +7 -0
- package/src/block/hydrate/hydrateBlock.ts +38 -0
- package/src/block/hydrate/index.ts +7 -0
- package/src/block/hydrate/transactionsFromHydratedBlock.ts +8 -0
- package/src/block/hydrate/tryHydrateBlock.ts +25 -0
- package/src/block/index.ts +1 -1
- package/src/block/primitives/{balanceStepSummaryFromRange.ts → balances/balancesStepSummaryFromRange.ts} +10 -10
- package/src/block/primitives/{balanceSummary.ts → balances/balancesSummary.ts} +6 -6
- package/src/block/primitives/balances/index.ts +2 -0
- package/src/block/primitives/blockFromBlockNumber.ts +33 -0
- package/src/block/primitives/hashFromBlockNumber.ts +3 -26
- package/src/block/primitives/index.ts +4 -3
- package/src/block/primitives/model.ts +7 -2
- package/src/block/primitives/{payloads.ts → payloads/BalancesStepSummary.ts} +4 -23
- package/src/block/primitives/payloads/ChainWindow.ts +6 -0
- package/src/block/primitives/payloads/StepSummary.ts +15 -0
- package/src/block/primitives/payloads/TransfersSummary.ts +30 -0
- package/src/block/primitives/payloads/index.ts +4 -0
- package/src/block/primitives/transfers/index.ts +2 -0
- package/src/block/primitives/transfers/transfersStepSummaryFromRange.ts +79 -0
- package/src/block/primitives/transfers/transfersSummary.ts +31 -0
- package/src/config/Producer.ts +17 -0
- package/src/index.ts +2 -0
- package/src/payload/index.ts +1 -0
- package/src/payload/netTransfersForPayloads.ts +30 -0
- package/src/steps/index.ts +1 -0
- package/src/steps/primitives/addressStakeWeight.ts +51 -0
- package/src/steps/primitives/claimedRewards.ts +5 -0
- package/src/steps/primitives/index.ts +16 -0
- package/src/steps/primitives/networkStakeStepAddressReward.ts +6 -0
- package/src/steps/primitives/networkStakeStepPoolRewardShares.ts +6 -0
- package/src/steps/primitives/networkStakeStepPoolRewards.ts +6 -0
- package/src/steps/primitives/networkStakeStepRewardAddressHistory.ts +6 -0
- package/src/steps/primitives/networkStakeStepRewardAddressShare.ts +6 -0
- package/src/steps/primitives/networkStakeStepRewardForStep.ts +5 -0
- package/src/steps/primitives/networkStakeStepRewardPositionWeight.ts +5 -0
- package/src/steps/primitives/networkStakeStepRewardPotentialPositionLoss.ts +5 -0
- package/src/steps/primitives/networkStakeStepRewardRandomizer.ts +5 -0
- package/src/steps/primitives/networkStakeStepRewardWeightForAddress.ts +6 -0
- package/src/steps/primitives/stakersAsOfBlock.ts +18 -0
- package/src/steps/primitives/startingStakes.ts +30 -0
- package/src/steps/primitives/totalStakeWeight.ts +35 -0
- package/src/steps/primitives/unclaimedRewards.ts +6 -0
- package/src/time/index.ts +1 -0
- package/src/time/primitives/index.ts +1 -0
- package/src/time/primitives/xl1BlockNumberToEthBlockNumber.ts +13 -0
- package/dist/neutral/block/hydrateBlock.d.ts +0 -12
- package/dist/neutral/block/hydrateBlock.d.ts.map +0 -1
- package/dist/neutral/block/primitives/balanceStepSummaryFromRange.d.ts +0 -6
- package/dist/neutral/block/primitives/balanceStepSummaryFromRange.d.ts.map +0 -1
- package/dist/neutral/block/primitives/balanceSummary.d.ts +0 -4
- package/dist/neutral/block/primitives/balanceSummary.d.ts.map +0 -1
- package/dist/neutral/block/primitives/payloads.d.ts.map +0 -1
- 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
|
+
}
|
package/src/config/Producer.ts
CHANGED
|
@@ -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'
|
package/src/payload/index.ts
CHANGED
|
@@ -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,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 networkStakeStepRewardAddressShare(address: Address, step: number, block: number): Promisable<[bigint, 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 @@
|
|
|
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
|
-
}
|