@xyo-network/xl1-protocol-sdk 1.15.2 → 1.15.3

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 (153) hide show
  1. package/README.md +1507 -388
  2. package/dist/neutral/block/hydrate/hydrateBlock.d.ts +5 -2
  3. package/dist/neutral/block/hydrate/hydrateBlock.d.ts.map +1 -1
  4. package/dist/neutral/block/primitives/balances/balancesStepSummaryFromRange.d.ts.map +1 -1
  5. package/dist/neutral/block/primitives/balances/balancesSummary.d.ts.map +1 -1
  6. package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts +2 -2
  7. package/dist/neutral/block/primitives/blockFromBlockNumber.d.ts.map +1 -1
  8. package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts +2 -2
  9. package/dist/neutral/block/primitives/hashFromBlockNumber.d.ts.map +1 -1
  10. package/dist/neutral/block/primitives/model.d.ts +8 -8
  11. package/dist/neutral/block/primitives/model.d.ts.map +1 -1
  12. package/dist/neutral/block/primitives/payloads/StepSummary.d.ts.map +1 -1
  13. package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts +1 -2
  14. package/dist/neutral/block/primitives/payloads/TransfersSummary.d.ts.map +1 -1
  15. package/dist/neutral/block/primitives/transfers/transfersStepSummaryFromRange.d.ts.map +1 -1
  16. package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts +1 -1
  17. package/dist/neutral/block/primitives/transfers/transfersSummary.d.ts.map +1 -1
  18. package/dist/neutral/config/Bridge.d.ts +8 -0
  19. package/dist/neutral/config/Bridge.d.ts.map +1 -0
  20. package/dist/neutral/config/Config.d.ts +5 -0
  21. package/dist/neutral/config/Config.d.ts.map +1 -1
  22. package/dist/neutral/index.d.ts +2 -0
  23. package/dist/neutral/index.d.ts.map +1 -1
  24. package/dist/neutral/index.mjs +296 -298
  25. package/dist/neutral/index.mjs.map +1 -1
  26. package/dist/neutral/instances/ShiftedBigIntConfig.d.ts +1 -1
  27. package/dist/neutral/instances/ShiftedBigIntConfig.d.ts.map +1 -1
  28. package/dist/neutral/instances/XL1Amount.d.ts +1 -1
  29. package/dist/neutral/instances/XL1Amount.d.ts.map +1 -1
  30. package/dist/neutral/map/AsynchronousMap.d.ts +14 -0
  31. package/dist/neutral/map/AsynchronousMap.d.ts.map +1 -0
  32. package/dist/neutral/map/MapType.d.ts +6 -0
  33. package/dist/neutral/map/MapType.d.ts.map +1 -0
  34. package/dist/neutral/map/SynchronousMap.d.ts +13 -0
  35. package/dist/neutral/map/SynchronousMap.d.ts.map +1 -0
  36. package/dist/neutral/map/index.d.ts +4 -0
  37. package/dist/neutral/map/index.d.ts.map +1 -0
  38. package/dist/neutral/model/ChainContext/ChainContext.d.ts +15 -0
  39. package/dist/neutral/model/ChainContext/ChainContext.d.ts.map +1 -0
  40. package/dist/neutral/model/ChainContext/ChainStakeContext.d.ts +10 -0
  41. package/dist/neutral/model/ChainContext/ChainStakeContext.d.ts.map +1 -0
  42. package/dist/neutral/model/ChainContext/ChainStateContext.d.ts +9 -0
  43. package/dist/neutral/model/ChainContext/ChainStateContext.d.ts.map +1 -0
  44. package/dist/neutral/model/ChainContext/ChainStoreContext.d.ts +10 -0
  45. package/dist/neutral/model/ChainContext/ChainStoreContext.d.ts.map +1 -0
  46. package/dist/neutral/model/ChainContext/index.d.ts +5 -0
  47. package/dist/neutral/model/ChainContext/index.d.ts.map +1 -0
  48. package/dist/neutral/model/ChainFork/ChainForkStatic.d.ts +8 -0
  49. package/dist/neutral/model/ChainFork/ChainForkStatic.d.ts.map +1 -0
  50. package/dist/neutral/model/ChainFork/index.d.ts +2 -0
  51. package/dist/neutral/model/ChainFork/index.d.ts.map +1 -0
  52. package/dist/neutral/model/ChainIdentity.d.ts +5 -0
  53. package/dist/neutral/model/ChainIdentity.d.ts.map +1 -0
  54. package/dist/neutral/model/ChainStake/ChainStakeRead.d.ts +17 -0
  55. package/dist/neutral/model/ChainStake/ChainStakeRead.d.ts.map +1 -0
  56. package/dist/neutral/model/ChainStake/ChainStakeStatic.d.ts +7 -0
  57. package/dist/neutral/model/ChainStake/ChainStakeStatic.d.ts.map +1 -0
  58. package/dist/neutral/model/ChainStake/ChainStakeWrite.d.ts +6 -0
  59. package/dist/neutral/model/ChainStake/ChainStakeWrite.d.ts.map +1 -0
  60. package/dist/neutral/model/ChainStake/index.d.ts +4 -0
  61. package/dist/neutral/model/ChainStake/index.d.ts.map +1 -0
  62. package/dist/neutral/model/ChainStore.d.ts +10 -0
  63. package/dist/neutral/model/ChainStore.d.ts.map +1 -0
  64. package/dist/neutral/model/PayloadMap.d.ts +7 -0
  65. package/dist/neutral/model/PayloadMap.d.ts.map +1 -0
  66. package/dist/neutral/model/StakeEvents.d.ts +31 -0
  67. package/dist/neutral/model/StakeEvents.d.ts.map +1 -0
  68. package/dist/neutral/model/index.d.ts +8 -0
  69. package/dist/neutral/model/index.d.ts.map +1 -0
  70. package/dist/neutral/payload/netTransfersForPayloads.d.ts +1 -1
  71. package/dist/neutral/payload/netTransfersForPayloads.d.ts.map +1 -1
  72. package/dist/neutral/steps/primitives/index.d.ts +0 -10
  73. package/dist/neutral/steps/primitives/index.d.ts.map +1 -1
  74. package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts +2 -2
  75. package/dist/neutral/time/primitives/xl1BlockNumberToEthBlockNumber.d.ts.map +1 -1
  76. package/dist/neutral/transaction/buildTransaction.d.ts +2 -2
  77. package/dist/neutral/transaction/buildTransaction.d.ts.map +1 -1
  78. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts +2 -2
  79. package/dist/neutral/transaction/buildUnsignedTransaction.d.ts.map +1 -1
  80. package/dist/neutral/transaction/hydrateTransaction.d.ts +5 -5
  81. package/dist/neutral/transaction/hydrateTransaction.d.ts.map +1 -1
  82. package/package.json +29 -29
  83. package/src/block/hydrate/hydrateBlock.ts +32 -10
  84. package/src/block/primitives/balances/balancesStepSummaryFromRange.ts +5 -4
  85. package/src/block/primitives/balances/balancesSummary.ts +3 -2
  86. package/src/block/primitives/blockFromBlockNumber.ts +8 -6
  87. package/src/block/primitives/hashFromBlockNumber.ts +2 -2
  88. package/src/block/primitives/model.ts +13 -11
  89. package/src/block/primitives/payloads/StepSummary.ts +1 -1
  90. package/src/block/primitives/payloads/TransfersSummary.ts +1 -2
  91. package/src/block/primitives/transfers/transfersStepSummaryFromRange.ts +25 -15
  92. package/src/block/primitives/transfers/transfersSummary.ts +12 -7
  93. package/src/config/Bridge.ts +26 -0
  94. package/src/config/Config.ts +2 -0
  95. package/src/index.ts +2 -0
  96. package/src/instances/ShiftedBigIntConfig.ts +1 -1
  97. package/src/instances/XL1Amount.ts +1 -1
  98. package/src/map/AsynchronousMap.ts +15 -0
  99. package/src/map/MapType.ts +8 -0
  100. package/src/map/SynchronousMap.ts +13 -0
  101. package/src/map/index.ts +3 -0
  102. package/src/model/ChainContext/ChainContext.ts +20 -0
  103. package/src/model/ChainContext/ChainStakeContext.ts +12 -0
  104. package/src/model/ChainContext/ChainStateContext.ts +10 -0
  105. package/src/model/ChainContext/ChainStoreContext.ts +12 -0
  106. package/src/model/ChainContext/index.ts +4 -0
  107. package/src/model/ChainFork/ChainForkStatic.ts +8 -0
  108. package/src/model/ChainFork/index.ts +1 -0
  109. package/src/model/ChainIdentity.ts +5 -0
  110. package/src/model/ChainStake/ChainStakeRead.ts +17 -0
  111. package/src/model/ChainStake/ChainStakeStatic.ts +7 -0
  112. package/src/model/ChainStake/ChainStakeWrite.ts +5 -0
  113. package/src/model/ChainStake/index.ts +3 -0
  114. package/src/model/ChainStore.ts +13 -0
  115. package/src/model/PayloadMap.ts +10 -0
  116. package/src/model/StakeEvents.ts +38 -0
  117. package/src/model/index.ts +7 -0
  118. package/src/payload/netTransfersForPayloads.ts +7 -12
  119. package/src/steps/primitives/index.ts +0 -10
  120. package/src/time/primitives/xl1BlockNumberToEthBlockNumber.ts +4 -5
  121. package/src/transaction/buildTransaction.ts +2 -2
  122. package/src/transaction/buildUnsignedTransaction.ts +2 -2
  123. package/src/transaction/hydrateTransaction.ts +24 -9
  124. package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts +0 -4
  125. package/dist/neutral/steps/primitives/networkStakeStepAddressReward.d.ts.map +0 -1
  126. package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts +0 -4
  127. package/dist/neutral/steps/primitives/networkStakeStepPoolRewardShares.d.ts.map +0 -1
  128. package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts +0 -4
  129. package/dist/neutral/steps/primitives/networkStakeStepPoolRewards.d.ts.map +0 -1
  130. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts +0 -4
  131. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressHistory.d.ts.map +0 -1
  132. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts +0 -4
  133. package/dist/neutral/steps/primitives/networkStakeStepRewardAddressShare.d.ts.map +0 -1
  134. package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts +0 -3
  135. package/dist/neutral/steps/primitives/networkStakeStepRewardForStep.d.ts.map +0 -1
  136. package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts +0 -3
  137. package/dist/neutral/steps/primitives/networkStakeStepRewardPositionWeight.d.ts.map +0 -1
  138. package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts +0 -3
  139. package/dist/neutral/steps/primitives/networkStakeStepRewardPotentialPositionLoss.d.ts.map +0 -1
  140. package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts +0 -3
  141. package/dist/neutral/steps/primitives/networkStakeStepRewardRandomizer.d.ts.map +0 -1
  142. package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts +0 -4
  143. package/dist/neutral/steps/primitives/networkStakeStepRewardWeightForAddress.d.ts.map +0 -1
  144. package/src/steps/primitives/networkStakeStepAddressReward.ts +0 -6
  145. package/src/steps/primitives/networkStakeStepPoolRewardShares.ts +0 -6
  146. package/src/steps/primitives/networkStakeStepPoolRewards.ts +0 -6
  147. package/src/steps/primitives/networkStakeStepRewardAddressHistory.ts +0 -6
  148. package/src/steps/primitives/networkStakeStepRewardAddressShare.ts +0 -6
  149. package/src/steps/primitives/networkStakeStepRewardForStep.ts +0 -5
  150. package/src/steps/primitives/networkStakeStepRewardPositionWeight.ts +0 -5
  151. package/src/steps/primitives/networkStakeStepRewardPotentialPositionLoss.ts +0 -5
  152. package/src/steps/primitives/networkStakeStepRewardRandomizer.ts +0 -5
  153. package/src/steps/primitives/networkStakeStepRewardWeightForAddress.ts +0 -6
@@ -23,25 +23,26 @@ export async function balancesStepSummaryFromRange(
23
23
  // console.log(`balanceStepSummaryFromRange: head=${head}, range=${range[0]}-${range[1]}`)
24
24
  const frameHeadHash = await hashFromBlockNumber(context, range[1])
25
25
  const frameSize = range[1] - range[0] + 1
26
+ const head = await context.head()
26
27
 
27
28
  let result: BalancesStepSummary | undefined = undefined
28
29
 
29
30
  if (frameSize === 1) {
30
31
  const hash = await hashFromBlockNumber(context, range[0])
31
- const [, payloads] = await hydrateBlock(context.chainArchivist, hash)
32
+ const [, payloads] = await hydrateBlock(context.store, hash)
32
33
  const balances: Record<Address, SignedBigInt> = {}
33
34
  for (const [address, balance] of Object.entries(netBalancesForPayloads(payloads))) {
34
35
  balances[address as Address] = toSignedBigInt(balance)
35
36
  }
36
37
  result = {
37
- schema: BalancesStepSummarySchema, hash: context.head, stepSize: -1, balances,
38
+ schema: BalancesStepSummarySchema, hash: head, stepSize: -1, balances,
38
39
  }
39
40
  } else {
40
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
42
  const step = (StepSizes as any).indexOf(frameSize)
42
43
  assertEx(step !== -1, () => `Invalid step size: ${frameSize}. Must be one of ${StepSizes.join(', ')}`)
43
44
 
44
- const [summaryResult] = await context.summaryRepository.get([frameHeadHash])
45
+ const summaryResult = await context.summaryMap.get(`${frameHeadHash}|${frameSize}`)
45
46
  if (isAnyPayload(summaryResult)) {
46
47
  result = summaryResult as WithStorageMeta<BalancesStepSummary>
47
48
  } else {
@@ -70,7 +71,7 @@ export async function balancesStepSummaryFromRange(
70
71
  schema: BalancesStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, balances,
71
72
  }
72
73
 
73
- await context.summaryRepository.insert([result])
74
+ await context.summaryMap.set(`${frameHeadHash}|${frameSize}`, result)
74
75
  }
75
76
  }
76
77
  // console.log(`balanceStepSummaryFromRange-result: head=${head}, range=${range[0]}-${range[1]}: ${toSafeJsonString(result, 10)}`)
@@ -13,8 +13,9 @@ export async function balancesSummary(
13
13
  context: BalanceStepSummaryContext,
14
14
  ): Promise<Partial<Record<Address, bigint>>> {
15
15
  return await spanRootAsync('balanceSummary', async () => {
16
- const headResult = await context.chainArchivist.get([context.head])
17
- const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult.at(0), () => `Head block not found for hash: ${context.head}`, { required: true })
16
+ const head = await context.head()
17
+ const headResult = await context.store.chainMap.get(head)
18
+ const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult, () => `Head block not found for hash: ${context.head}`, { required: true })
18
19
  const rangeStart = isDefined(context.windowSize) ? Math.max(headBoundWitness.block - context.windowSize + 1, 0) : 0
19
20
  const ranges = deepCalculateFramesFromRange([rangeStart, headBoundWitness.block])
20
21
  const summaries = await Promise.all(ranges.map(range => balancesStepSummaryFromRange(context, range)))
@@ -4,11 +4,12 @@ import type { WithStorageMeta } from '@xyo-network/payload-model'
4
4
  import type { BlockBoundWitness } from '@xyo-network/xl1-protocol'
5
5
  import { asBlockBoundWitnessWithStorageMeta, StepSizes } from '@xyo-network/xl1-protocol'
6
6
 
7
- import type { ChainContext } from './model.ts'
7
+ import type { ChainContextRead } from '../../model/index.ts'
8
8
 
9
- export async function blockFromBlockNumber(context: ChainContext, blockNumber: number): Promise<WithStorageMeta<BlockBoundWitness>> {
10
- const result = await context.chainArchivist.get([context.head])
11
- let currentBlock = asBlockBoundWitnessWithStorageMeta(result.at(0), () => `Head block not found for hash: ${context.head}`, { required: true })
9
+ export async function blockFromBlockNumber(context: ChainContextRead, blockNumber: number): Promise<WithStorageMeta<BlockBoundWitness>> {
10
+ const head = await context.head()
11
+ const result = await context.store.chainMap.get(head)
12
+ let currentBlock = asBlockBoundWitnessWithStorageMeta(result, () => `Head block not found for hash: ${head}`, { required: true })
12
13
  while (currentBlock.block > blockNumber) {
13
14
  let jumpHash: Hash | null = currentBlock.previous
14
15
  let jumpBlockNumber = currentBlock.block - 1
@@ -19,8 +20,9 @@ export async function blockFromBlockNumber(context: ChainContext, blockNumber: n
19
20
  jumpHash = asHash(currentBlock.step_hashes.at(step), () => `Step hash not found for step ${step} in block ${currentBlock.block}`)
20
21
  }
21
22
  }
22
- const [newBlock] = await context.chainArchivist.get([
23
- asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`)])
23
+ const newBlock = await context.store.chainMap.get(
24
+ asHash(jumpHash, () => `Jump hash not found for block number [${blockNumber}]: ${jumpBlockNumber} ${toSafeJsonString(currentBlock, 10)}`),
25
+ )
24
26
  currentBlock = asBlockBoundWitnessWithStorageMeta(newBlock, () => `Block not found for hash: ${jumpHash}`, { required: true })
25
27
  if (currentBlock.block === blockNumber) {
26
28
  break
@@ -1,8 +1,8 @@
1
1
  import { type Hash } from '@xylabs/hex'
2
2
 
3
+ import type { ChainContextRead } from '../../model/index.ts'
3
4
  import { blockFromBlockNumber } from './blockFromBlockNumber.ts'
4
- import type { ChainContext } from './model.ts'
5
5
 
6
- export async function hashFromBlockNumber(context: ChainContext, blockNumber: number): Promise<Hash> {
6
+ export async function hashFromBlockNumber(context: ChainContextRead, blockNumber: number): Promise<Hash> {
7
7
  return (await blockFromBlockNumber(context, blockNumber))._hash
8
8
  }
@@ -1,23 +1,25 @@
1
- import type { Address, Hash } from '@xylabs/hex'
2
1
  import type { ReadArchivist } from '@xyo-network/archivist-model'
3
2
  import type { Payload } from '@xyo-network/payload-model'
4
- import type { PayloadRepository } from '@xyo-network/xl1-protocol'
5
3
 
4
+ import type { MapTypeRead, MapTypeWrite } from '../../map/index.ts'
5
+ import type { ChainContextRead } from '../../model/index.ts'
6
6
  import type { BalancesStepSummary, TransfersStepSummary } from './payloads/index.ts'
7
7
 
8
- export interface ChainContext {
9
- chainArchivist: ReadArchivist
10
- head: Hash
8
+ export function isReadArchivist(obj: unknown): obj is ReadArchivist {
9
+ return (obj as ReadArchivist).get !== undefined && (obj as ReadArchivist).next !== undefined
10
+ }
11
+
12
+ export interface ChainSummaryContextRead<T extends Payload> extends ChainContextRead {
13
+ summaryMap: MapTypeRead<string, T>
11
14
  windowSize?: number
12
15
  }
13
16
 
14
- export interface ChainSummaryContext<T extends Payload> extends ChainContext {
15
- summaryRepository: PayloadRepository<Hash, T>
17
+ export interface ChainSummaryContextWrite<T extends Payload> extends ChainContextRead {
18
+ summaryMap: MapTypeWrite<string, T>
16
19
  }
17
20
 
21
+ export type ChainSummaryContext<T extends Payload> = ChainSummaryContextRead<T> & ChainSummaryContextWrite<T>
22
+
18
23
  export interface BalanceStepSummaryContext extends ChainSummaryContext<BalancesStepSummary> {}
19
24
 
20
- export interface TransfersStepSummaryContext extends ChainSummaryContext<TransfersStepSummary> {
21
- /* The address that the transfers to/from are being summarized */
22
- account: Address
23
- }
25
+ export interface TransfersStepSummaryContext extends ChainSummaryContext<TransfersStepSummary> {}
@@ -12,4 +12,4 @@ export interface StepSummaryFields {
12
12
 
13
13
  export type StepSummary<TAdditionalFields extends EmptyObject | void = void,
14
14
  TSchema extends Schema | void = void> = Payload<TAdditionalFields extends void ? StepSummaryFields : TAdditionalFields & StepSummaryFields,
15
- TSchema extends void ? StepSummarySchema : TSchema>
15
+ TSchema extends void ? StepSummarySchema : TSchema>
@@ -10,8 +10,7 @@ export const TransfersStepSummarySchema: Schema = 'network.xyo.step.summary.tran
10
10
  export type TransfersStepSummarySchema = typeof TransfersStepSummarySchema
11
11
 
12
12
  export type TransfersStepSummary = StepSummary<{
13
- account: Address
14
- transfers: Record<Address, SignedBigInt>
13
+ transfers: Record<Address, Record<Address, SignedBigInt>>
15
14
  }, TransfersStepSummarySchema>
16
15
 
17
16
  /**
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-statements */
1
2
  import { assertEx } from '@xylabs/assert'
2
3
  import { type Address } from '@xylabs/hex'
3
4
  import { PayloadBuilder } from '@xyo-network/payload-builder'
@@ -22,26 +23,29 @@ export async function transfersStepSummaryFromRange(
22
23
  // console.log(`transfersStepSummaryFromRange: head=${head}, range=${range[0]}-${range[1]}`)
23
24
  const frameHeadHash = await hashFromBlockNumber(context, range[1])
24
25
  const frameSize = range[1] - range[0] + 1
25
- const { account } = context
26
+ const head = await context.head()
26
27
 
27
28
  let result: TransfersStepSummary | undefined = undefined
28
29
 
29
30
  if (frameSize === 1) {
30
31
  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)
32
+ const [, payloads] = await hydrateBlock(context.store, hash)
33
+ const transfers: Record<Address, Record<Address, SignedBigInt>> = {}
34
+ for (const [from, toMap] of Object.entries(netTransfersForPayloads(payloads))) {
35
+ transfers[from as Address] = transfers[from as Address] ?? {}
36
+ for (const [to, amount] of Object.entries(toMap)) {
37
+ transfers[from as Address][to as Address] = toSignedBigInt(amount)
38
+ }
35
39
  }
36
40
  result = {
37
- schema: TransfersStepSummarySchema, hash: context.head, stepSize: -1, transfers, account,
41
+ schema: TransfersStepSummarySchema, hash: head, stepSize: -1, transfers,
38
42
  }
39
43
  } else {
40
44
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
45
  const step = (StepSizes as any).indexOf(frameSize)
42
46
  assertEx(step !== -1, () => `Invalid step size: ${frameSize}. Must be one of ${StepSizes.join(', ')}`)
43
47
 
44
- const [summaryResult] = await context.summaryRepository.get([frameHeadHash])
48
+ const summaryResult = await context.summaryMap.get(`${frameHeadHash}|${frameSize}`)
45
49
  if (isAnyPayload(summaryResult)) {
46
50
  result = summaryResult as WithStorageMeta<TransfersStepSummary>
47
51
  } else {
@@ -54,23 +58,29 @@ export async function transfersStepSummaryFromRange(
54
58
  const subResults = await Promise.all(promises)
55
59
 
56
60
  // add them all up
57
- const bigIntBalances: Record<Address, bigint> = {}
61
+ const bigIntBalances: Record<Address, Record<Address, bigint>> = {}
58
62
  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)
63
+ for (const [from, toMap] of Object.entries(subResult.transfers)) {
64
+ bigIntBalances[from as Address] = bigIntBalances[from as Address] ?? {}
65
+ for (const [to, transfer] of Object.entries(toMap)) {
66
+ bigIntBalances[from as Address][to as Address] = (bigIntBalances[from as Address][to as Address] ?? 0n) + parseSignedBigInt(transfer)
67
+ }
61
68
  }
62
69
  }
63
70
 
64
- const transfers: Record<Address, SignedBigInt> = {}
65
- for (const [address, transfer] of Object.entries(bigIntBalances)) {
66
- transfers[address as Address] = toSignedBigInt(transfer)
71
+ const transfers: Record<Address, Record<Address, SignedBigInt>> = {}
72
+ for (const [from, toMap] of Object.entries(bigIntBalances)) {
73
+ transfers[from as Address] = transfers[from as Address] ?? {}
74
+ for (const [to, transfer] of Object.entries(toMap)) {
75
+ transfers[from as Address][to as Address] = toSignedBigInt(transfer)
76
+ }
67
77
  }
68
78
 
69
79
  result = {
70
- schema: TransfersStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, transfers, account,
80
+ schema: TransfersStepSummarySchema, hash: frameHeadHash, stepSize: frameSize, transfers,
71
81
  }
72
82
 
73
- await context.summaryRepository.insert([result])
83
+ await context.summaryMap.set(`${frameHeadHash}|${frameSize}`, result)
74
84
  }
75
85
  }
76
86
  // console.log(`transfersStepSummaryFromRange-result: head=${head}, range=${range[0]}-${range[1]}: ${toSafeJsonString(result, 10)}`)
@@ -12,18 +12,23 @@ import { transfersStepSummaryFromRange } from './transfersStepSummaryFromRange.t
12
12
  // the summary of amount of rewards claimed from the step reward pool by addresses
13
13
  export async function transfersSummary(
14
14
  context: TransfersStepSummaryContext,
15
- ): Promise<Partial<Record<Address, bigint>>> {
15
+ ): Promise<Partial<Record<Address, Partial<Record<Address, bigint>>>>> {
16
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 })
17
+ const head = await context.head()
18
+ const headResult = await context.store.chainMap.get(head)
19
+ const headBoundWitness = asBlockBoundWitnessWithStorageMeta(headResult, () => `Head block not found for hash: ${context.head}`, { required: true })
19
20
  const rangeStart = isDefined(context.windowSize) ? Math.max(headBoundWitness.block - context.windowSize + 1, 0) : 0
20
21
  const ranges = deepCalculateFramesFromRange([rangeStart, headBoundWitness.block])
21
22
  const summaries = await Promise.all(ranges.map(range => transfersStepSummaryFromRange(context, range)))
22
- const transfers: Partial<Record<Address, bigint>> = {}
23
+ const transfers: Partial<Record<Address, Partial<Record<Address, bigint>>>> = {}
23
24
  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)
25
+ for (const [from, toMap] of Object.entries(summary.transfers)) {
26
+ const validFrom = asAddress(from, () => `Invalid address: ${from}`)
27
+ transfers[validFrom] = transfers[validFrom] ?? {}
28
+ for (const [to, transfer] of Object.entries(toMap)) {
29
+ const validTo = asAddress(to, () => `Invalid address: ${to}`)
30
+ transfers[validFrom][validTo] = (transfers[validFrom][validTo] ?? 0n) + parseSignedBigInt(transfer)
31
+ }
27
32
  }
28
33
  }
29
34
  return transfers
@@ -0,0 +1,26 @@
1
+ import { globalRegistry } from 'zod'
2
+ import * as z from 'zod'
3
+
4
+ import { MnemonicStringZod } from '../validation/index.ts'
5
+
6
+ export const BridgeConfigZod = z.object({
7
+ host: z.string().default('localhost').register(globalRegistry, {
8
+ default: 'localhost',
9
+ description: 'Host for the Bridge',
10
+ title: 'api.host',
11
+ type: 'string',
12
+ }),
13
+ mnemonic: MnemonicStringZod.optional().register(globalRegistry, {
14
+ description: 'Mnemonic for the Bridge wallet',
15
+ title: 'api.mnemonic',
16
+ type: 'string',
17
+ }),
18
+ port: z.coerce.number().default(8081).register(globalRegistry, {
19
+ default: 8081,
20
+ description: 'Port for the Bridge',
21
+ title: 'api.port',
22
+ type: 'number',
23
+ }),
24
+ })
25
+
26
+ export type BridgeConfig = z.infer<typeof BridgeConfigZod>
@@ -2,6 +2,7 @@ import * as z from 'zod'
2
2
 
3
3
  import { ApiConfigZod } from './Api.ts'
4
4
  import { AppConfigZod } from './App.ts'
5
+ import { BridgeConfigZod } from './Bridge.ts'
5
6
  import { ChainConfigZod } from './Chain.ts'
6
7
  import { EvmConfigZod } from './Evm.ts'
7
8
  import { LogConfigZod } from './Log.ts'
@@ -15,6 +16,7 @@ export const ConfigZod = z.object({
15
16
  ...Xl1CommonConfigSchema.shape,
16
17
  api: ApiConfigZod.default(ApiConfigZod.parse({})).describe('Configuration for the API node'),
17
18
  app: AppConfigZod.default(AppConfigZod.parse({})).describe('Configuration for the application'),
19
+ bridge: BridgeConfigZod.default(BridgeConfigZod.parse({})).describe('Configuration for the Bridge node'),
18
20
  chain: ChainConfigZod.default(ChainConfigZod.parse({})).describe('Configuration for the chain'),
19
21
  evm: EvmConfigZod.default(EvmConfigZod.parse({})).describe('Configuration for EVM-backed services'),
20
22
  producer: ProducerConfigZod.default(ProducerConfigZod.parse({})).describe('Configuration for the producer'),
package/src/index.ts CHANGED
@@ -3,6 +3,8 @@ export * from './ChainServiceCollection.ts'
3
3
  export * from './ChainServiceCollectionV2.ts'
4
4
  export * from './config/index.ts'
5
5
  export * from './instances/index.ts'
6
+ export * from './map/index.ts'
7
+ export * from './model/index.ts'
6
8
  export * from './payload/index.ts'
7
9
  export * from './SignedBigInt.ts'
8
10
  export * from './steps/index.ts'
@@ -1,4 +1,4 @@
1
- /** @deprecated use from @xyo-network/xl1-protocol instead */
1
+ /** @deprecated use from \@xyo-network/xl1-protocol instead */
2
2
  export interface ShiftedBigIntConfig {
3
3
  locale: Intl.LocalesArgument
4
4
  maxCharacters: number
@@ -7,7 +7,7 @@ import type {
7
7
 
8
8
  import type { ShiftedBigIntConfig } from './ShiftedBigIntConfig.ts'
9
9
 
10
- /** @deprecated use from @xyo-network/xl1-protocol instead */
10
+ /** @deprecated use from \@xyo-network/xl1-protocol instead */
11
11
  export interface XL1AmountInstance {
12
12
  value: AttoXL1
13
13
 
@@ -0,0 +1,15 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+
3
+ export interface AsynchronousMapRead<K, V> {
4
+ get(id: K): Promisable<V | undefined>
5
+ getMany(id: K[]): Promisable<V[]>
6
+ has(id: K): Promisable<boolean>
7
+ }
8
+
9
+ export interface AsynchronousMapWrite<K, V> {
10
+ clear(): Promisable<void>
11
+ delete(id: K): Promisable<boolean>
12
+ set(id: K, data: V): Promisable<void>
13
+ }
14
+
15
+ export interface AsynchronousMap<K, V> extends AsynchronousMapRead<K, V>, AsynchronousMapWrite<K, V> {}
@@ -0,0 +1,8 @@
1
+ import type { AsynchronousMapRead, AsynchronousMapWrite } from './AsynchronousMap.ts'
2
+ import type { SynchronousMapRead, SynchronousMapWrite } from './SynchronousMap.ts'
3
+
4
+ export type MapTypeWrite<TId, TData> = SynchronousMapWrite<TId, TData> | AsynchronousMapWrite<TId, TData>
5
+
6
+ export type MapTypeRead<TId, TData> = SynchronousMapRead<TId, TData> | AsynchronousMapRead<TId, TData>
7
+
8
+ export type MapType<TId, TData> = MapTypeRead<TId, TData> & MapTypeWrite<TId, TData>
@@ -0,0 +1,13 @@
1
+ export interface SynchronousMapRead<K, V> {
2
+ get(id: K): V | undefined
3
+ getMany(id: K[]): V[]
4
+ has(id: K): boolean
5
+ }
6
+
7
+ export interface SynchronousMapWrite<K, V> {
8
+ clear(): void
9
+ delete(id: K): boolean
10
+ set(id: K, data: V): void
11
+ }
12
+
13
+ export interface SynchronousMap<K, V> extends SynchronousMapRead<K, V>, SynchronousMapWrite<K, V> {}
@@ -0,0 +1,3 @@
1
+ export * from './AsynchronousMap.ts'
2
+ export * from './MapType.ts'
3
+ export * from './SynchronousMap.ts'
@@ -0,0 +1,20 @@
1
+ import type { ChainIdentity } from '../ChainIdentity.ts'
2
+ import type {
3
+ ChainStakeContext, ChainStakeContextRead, ChainStakeContextWrite,
4
+ } from './ChainStakeContext.ts'
5
+ import type { ChainStateContextRead, ChainStateContextWrite } from './ChainStateContext.ts'
6
+ import type {
7
+ ChainStoreContext, ChainStoreContextRead, ChainStoreContextWrite,
8
+ } from './ChainStoreContext.ts'
9
+
10
+ export interface ChainContextWrite extends ChainIdentity, ChainStateContextWrite, ChainStoreContextWrite {}
11
+
12
+ export interface StakedChainContextWrite extends ChainContextWrite, ChainStakeContextWrite {}
13
+
14
+ export interface ChainContextRead extends ChainIdentity, ChainStateContextRead, ChainStoreContextRead {}
15
+
16
+ export interface StakedChainContextRead extends ChainContextRead, ChainStakeContextRead {}
17
+
18
+ export type ChainContext = ChainIdentity & ChainContextRead & ChainContextWrite & ChainStoreContext
19
+
20
+ export type StakedChainContext = ChainContext & ChainStakeContext & ChainStakeContextRead & ChainStakeContextWrite
@@ -0,0 +1,12 @@
1
+ import type { ChainIdentity } from '../ChainIdentity.ts'
2
+ import type { ChainStakeRead, ChainStakeWrite } from '../ChainStake/index.ts'
3
+
4
+ export interface ChainStakeContextWrite extends ChainIdentity {
5
+ stake: ChainStakeWrite
6
+ }
7
+
8
+ export interface ChainStakeContextRead extends ChainIdentity {
9
+ stake: ChainStakeRead
10
+ }
11
+
12
+ export type ChainStakeContext = ChainStakeContextRead & ChainStakeContextWrite
@@ -0,0 +1,10 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+
4
+ export interface ChainStateContextRead {
5
+ head(): Promisable<Hash>
6
+ }
7
+
8
+ export interface ChainStateContextWrite {}
9
+
10
+ export type ChainStateContext = ChainStateContextRead & ChainStateContextWrite
@@ -0,0 +1,12 @@
1
+ import type { ChainIdentity } from '../ChainIdentity.ts'
2
+ import type { ChainStoreRead, ChainStoreWrite } from '../ChainStore.ts'
3
+
4
+ export interface ChainStoreContextWrite extends ChainIdentity {
5
+ store: ChainStoreWrite
6
+ }
7
+
8
+ export interface ChainStoreContextRead extends ChainIdentity {
9
+ store: ChainStoreRead
10
+ }
11
+
12
+ export type ChainStoreContext = ChainStoreContextRead & ChainStoreContextWrite
@@ -0,0 +1,4 @@
1
+ export * from './ChainContext.ts'
2
+ export * from './ChainStakeContext.ts'
3
+ export * from './ChainStateContext.ts'
4
+ export * from './ChainStoreContext.ts'
@@ -0,0 +1,8 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { ChainId } from '@xyo-network/xl1-protocol'
3
+
4
+ export interface ChainForkStatic {
5
+ forkedAtBlockNumber: number
6
+ forkedAtHash: Hash
7
+ forkedChainId: ChainId
8
+ }
@@ -0,0 +1 @@
1
+ export * from './ChainForkStatic.ts'
@@ -0,0 +1,5 @@
1
+ import type { ChainId } from '@xyo-network/xl1-protocol'
2
+
3
+ export interface ChainIdentity {
4
+ chainId: ChainId
5
+ }
@@ -0,0 +1,17 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+ import type { Stake } from '@xyo-network/xl1-protocol'
4
+
5
+ export interface ChainStakeRead {
6
+ active(): Promisable<bigint>
7
+ activeByAddressStaked(address: string): Promisable<bigint>
8
+ activeByStaker(address: string): Promisable<bigint>
9
+ pending(): Promisable<bigint>
10
+ pendingByStaker(staker: string): Promisable<bigint>
11
+ stakeById(id: number): Promisable<Stake>
12
+ stakeByStaker(staker: Address, slot: number): Promisable<Stake>
13
+ stakesByStaked(staked: Address, range?: [number, number | 'latest']): Promisable<Stake[]>
14
+ stakesByStaker(staker: Address, range?: [number, number | 'latest']): Promisable<Stake[]>
15
+ withdrawn(): Promisable<bigint>
16
+ withdrawnByStaker(staker: string): Promisable<bigint>
17
+ }
@@ -0,0 +1,7 @@
1
+ import type { Address } from '@xylabs/hex'
2
+
3
+ export interface ChainStakeStatic {
4
+ minWithdrawalBlocks: number
5
+ rewardsContract: Address
6
+ stakingTokenAddress: Address
7
+ }
@@ -0,0 +1,5 @@
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
+ }
@@ -0,0 +1,3 @@
1
+ export * from './ChainStakeRead.ts'
2
+ export * from './ChainStakeStatic.ts'
3
+ export * from './ChainStakeWrite.ts'
@@ -0,0 +1,13 @@
1
+ import type { Payload, WithStorageMeta } from '@xyo-network/payload-model'
2
+
3
+ import type { PayloadMapRead, PayloadMapWrite } from './PayloadMap.ts'
4
+
5
+ export interface ChainStoreWrite {
6
+ chainMap: PayloadMapWrite<WithStorageMeta<Payload>>
7
+ }
8
+
9
+ export interface ChainStoreRead {
10
+ chainMap: PayloadMapRead<WithStorageMeta<Payload>>
11
+ }
12
+
13
+ export type ChainStore = ChainStoreRead & ChainStoreWrite
@@ -0,0 +1,10 @@
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
+
4
+ import type {
5
+ MapType, MapTypeRead, MapTypeWrite,
6
+ } from '../map/index.ts'
7
+
8
+ export type PayloadMapWrite<T extends Payload = Payload> = MapTypeWrite<Hash, T>
9
+ export type PayloadMapRead<T extends Payload = Payload> = MapTypeRead<Hash, T>
10
+ export type PayloadMap<T extends Payload = Payload> = MapType<Hash, T>
@@ -0,0 +1,38 @@
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { JsonObject } from '@xylabs/object'
3
+ import type { Promisable } from '@xylabs/promise'
4
+
5
+ export const StakeEventNames = ['StakeAdded', 'StakeRemoved', 'StakeWithdrawn'] as const
6
+ export type StakeEventName = typeof StakeEventNames[number]
7
+
8
+ export interface ExternalEvent<TName extends string = string, TArgs extends JsonObject = {}> {
9
+ args: TArgs
10
+ name: TName
11
+ time: number // usually block number
12
+ }
13
+
14
+ export interface EventFilter<TName extends string = string> {
15
+ name?: TName
16
+ time?: [number, number]
17
+ }
18
+
19
+ export interface StakeEventArgs {
20
+ amount: bigint
21
+ id: number
22
+ staked: Address
23
+ staker: Address
24
+ }
25
+
26
+ export type StakeEventFilterArgs = Partial<Pick<StakeEventArgs, 'staker' | 'staked'>>
27
+
28
+ export interface StakeEventFilter<TName extends StakeEventName = StakeEventName> extends EventFilter<TName> {
29
+ args?: StakeEventFilterArgs
30
+ }
31
+
32
+ export interface StakeEvent<TName extends StakeEventName = StakeEventName> extends ExternalEvent<TName> {
33
+ args: StakeEventArgs
34
+ }
35
+
36
+ export interface StakeEventsRead {
37
+ stakeEvents<TName extends StakeEventName>(range: [number, number | 'latest'], filter?: StakeEventFilter<TName>): Promisable<StakeEvent<TName>[]>
38
+ }
@@ -0,0 +1,7 @@
1
+ export * from './ChainContext/index.ts'
2
+ export * from './ChainFork/index.ts'
3
+ export * from './ChainIdentity.ts'
4
+ export * from './ChainStake/index.ts'
5
+ export * from './ChainStore.ts'
6
+ export * from './PayloadMap.ts'
7
+ export * from './StakeEvents.ts'
@@ -6,22 +6,17 @@ import type { Payload } from '@xyo-network/payload-model'
6
6
  import { isTransfer } from '@xyo-network/xl1-protocol'
7
7
 
8
8
  // the net transfer amounts for the specified accounts only
9
- export function netTransfersForPayloads(payloads: Payload[], account: Address): Record<Address, bigint> {
9
+ export function netTransfersForPayloads(payloads: Payload[]): Record<Address, Record<Address, bigint>> {
10
10
  return span('netTransfersForPayloads', () => {
11
- const transfers: Record<Address, bigint> = {}
11
+ const transfers: Record<Address, Record<Address, bigint>> = {}
12
12
  for (const payload of payloads) {
13
13
  if (isTransfer(payload)) {
14
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
- }
15
+ transfers[from] = transfers[from] ?? {}
16
+ for (let [to, amount] of Object.entries(payload.transfers) as [Address, Hex][]) {
17
+ transfers[to] = transfers[to] ?? {}
18
+ transfers[to][from] = (transfers[to][from] ?? 0n) + hexToBigInt(amount)
19
+ transfers[from][to] = (transfers[from][to] ?? 0n) - hexToBigInt(amount)
25
20
  }
26
21
  }
27
22
  }
@@ -1,15 +1,5 @@
1
1
  export * from './addressStakeWeight.ts'
2
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
3
  export * from './stakersAsOfBlock.ts'
14
4
  export * from './startingStakes.ts'
15
5
  export * from './totalStakeWeight.ts'