@xyo-network/chain-validation 1.1.7 → 1.2.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.
Files changed (142) hide show
  1. package/dist/neutral/index.mjs +116 -105
  2. package/dist/neutral/index.mjs.map +1 -1
  3. package/dist/types/block/index.d.ts +0 -1
  4. package/dist/types/block/index.d.ts.map +1 -1
  5. package/dist/types/block/validateBlock.d.ts +1 -1
  6. package/dist/types/block/validateBlock.d.ts.map +1 -1
  7. package/dist/types/block/validators/AllowedPayloadSchemas.d.ts +1 -1
  8. package/dist/types/block/validators/AllowedPayloadSchemas.d.ts.map +1 -1
  9. package/dist/types/block/validators/Fields.d.ts +1 -1
  10. package/dist/types/block/validators/Fields.d.ts.map +1 -1
  11. package/dist/types/block/validators/JsonSchema.d.ts +1 -1
  12. package/dist/types/block/validators/JsonSchema.d.ts.map +1 -1
  13. package/dist/types/block/validators/PreviousHash.d.ts +1 -1
  14. package/dist/types/block/validators/PreviousHash.d.ts.map +1 -1
  15. package/dist/types/boundwitness/index.d.ts +0 -2
  16. package/dist/types/boundwitness/index.d.ts.map +1 -1
  17. package/dist/types/boundwitness/validators/BoundWitnessReferences.d.ts +1 -1
  18. package/dist/types/boundwitness/validators/BoundWitnessReferences.d.ts.map +1 -1
  19. package/dist/types/boundwitness/validators/BoundWitnessSignatures.d.ts +1 -1
  20. package/dist/types/boundwitness/validators/BoundWitnessSignatures.d.ts.map +1 -1
  21. package/dist/types/elevatedPayload/index.d.ts +1 -7
  22. package/dist/types/elevatedPayload/index.d.ts.map +1 -1
  23. package/dist/types/elevatedPayload/lib/index.d.ts +7 -0
  24. package/dist/types/elevatedPayload/lib/index.d.ts.map +1 -0
  25. package/dist/types/elevatedPayload/lib/isElevatedFromBlock.d.ts +4 -0
  26. package/dist/types/elevatedPayload/lib/isElevatedFromBlock.d.ts.map +1 -0
  27. package/dist/types/elevatedPayload/lib/validateElevatedFromBlock.d.ts +3 -0
  28. package/dist/types/elevatedPayload/lib/validateElevatedFromBlock.d.ts.map +1 -0
  29. package/dist/types/elevatedPayload/lib/validateElevatedFromTransaction.d.ts +3 -0
  30. package/dist/types/elevatedPayload/lib/validateElevatedFromTransaction.d.ts.map +1 -0
  31. package/dist/types/elevatedPayload/lib/validateIncludedInBlock.d.ts +4 -0
  32. package/dist/types/elevatedPayload/lib/validateIncludedInBlock.d.ts.map +1 -0
  33. package/dist/types/elevatedPayload/lib/validateTransactionInBlock.d.ts +3 -0
  34. package/dist/types/elevatedPayload/lib/validateTransactionInBlock.d.ts.map +1 -0
  35. package/dist/types/elevatedPayload/lib/validateTypedPayloadInBlock.d.ts +5 -0
  36. package/dist/types/elevatedPayload/lib/validateTypedPayloadInBlock.d.ts.map +1 -0
  37. package/dist/types/elevatedPayload/payloads/index.d.ts +5 -0
  38. package/dist/types/elevatedPayload/payloads/index.d.ts.map +1 -0
  39. package/dist/types/elevatedPayload/payloads/validateChainStakeIntentInBlock.d.ts +3 -0
  40. package/dist/types/elevatedPayload/payloads/validateChainStakeIntentInBlock.d.ts.map +1 -0
  41. package/dist/types/elevatedPayload/payloads/validateHashInBlock.d.ts +3 -0
  42. package/dist/types/elevatedPayload/payloads/validateHashInBlock.d.ts.map +1 -0
  43. package/dist/types/elevatedPayload/payloads/validateSchemaInBlock.d.ts +3 -0
  44. package/dist/types/elevatedPayload/payloads/validateSchemaInBlock.d.ts.map +1 -0
  45. package/dist/types/elevatedPayload/payloads/validateTransferInBlock.d.ts +3 -0
  46. package/dist/types/elevatedPayload/payloads/validateTransferInBlock.d.ts.map +1 -0
  47. package/dist/types/elevatedPayload/validatePayloadInBlock.d.ts +3 -0
  48. package/dist/types/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -0
  49. package/dist/types/hydratedBlock/index.d.ts +0 -1
  50. package/dist/types/hydratedBlock/index.d.ts.map +1 -1
  51. package/dist/types/hydratedBlock/validateHydratedBlock.d.ts +1 -1
  52. package/dist/types/hydratedBlock/validateHydratedBlock.d.ts.map +1 -1
  53. package/dist/types/hydratedBlock/validators/Payloads.d.ts +1 -1
  54. package/dist/types/hydratedBlock/validators/Payloads.d.ts.map +1 -1
  55. package/dist/types/hydratedBlockState/validateHydratedBlockState.d.ts +2 -2
  56. package/dist/types/hydratedBlockState/validateHydratedBlockState.d.ts.map +1 -1
  57. package/dist/types/hydratedBlockState/validators/RequiredBalance.d.ts +2 -2
  58. package/dist/types/hydratedBlockState/validators/RequiredBalance.d.ts.map +1 -1
  59. package/dist/types/transaction/validateTransaction.d.ts +3 -2
  60. package/dist/types/transaction/validateTransaction.d.ts.map +1 -1
  61. package/dist/types/transaction/validators/{TransactionElevation.d.ts → TransactionElevationValidator.d.ts} +1 -1
  62. package/dist/types/transaction/validators/TransactionElevationValidator.d.ts.map +1 -0
  63. package/dist/types/transaction/validators/TransactionFromValidator.d.ts +3 -0
  64. package/dist/types/transaction/validators/TransactionFromValidator.d.ts.map +1 -0
  65. package/dist/types/transaction/validators/{TransactionJsonSchema.d.ts → TransactionJsonSchemaValidator.d.ts} +1 -1
  66. package/dist/types/transaction/validators/TransactionJsonSchemaValidator.d.ts.map +1 -0
  67. package/dist/types/transaction/validators/{TransactionProtocol.d.ts → TransactionProtocolValidator.d.ts} +1 -1
  68. package/dist/types/transaction/validators/TransactionProtocolValidator.d.ts.map +1 -0
  69. package/dist/types/transaction/validators/index.d.ts +4 -3
  70. package/dist/types/transaction/validators/index.d.ts.map +1 -1
  71. package/package.json +16 -17
  72. package/src/block/index.ts +0 -1
  73. package/src/block/validateBlock.ts +1 -2
  74. package/src/block/validators/AllowedPayloadSchemas.ts +3 -4
  75. package/src/block/validators/Fields.ts +1 -3
  76. package/src/block/validators/JsonSchema.ts +1 -3
  77. package/src/block/validators/PreviousHash.ts +1 -3
  78. package/src/boundwitness/index.ts +0 -2
  79. package/src/boundwitness/validators/BoundWitnessReferences.ts +1 -2
  80. package/src/boundwitness/validators/BoundWitnessSignatures.ts +1 -2
  81. package/src/elevatedPayload/index.ts +1 -7
  82. package/src/elevatedPayload/lib/index.ts +6 -0
  83. package/src/elevatedPayload/lib/isElevatedFromBlock.ts +12 -0
  84. package/src/elevatedPayload/{validateElevatedInBlock.ts → lib/validateElevatedFromBlock.ts} +2 -4
  85. package/src/elevatedPayload/lib/validateElevatedFromTransaction.ts +20 -0
  86. package/src/elevatedPayload/lib/validateIncludedInBlock.ts +10 -0
  87. package/src/elevatedPayload/lib/validateTransactionInBlock.ts +18 -0
  88. package/src/elevatedPayload/lib/validateTypedPayloadInBlock.ts +27 -0
  89. package/src/elevatedPayload/payloads/index.ts +4 -0
  90. package/src/elevatedPayload/payloads/validateChainStakeIntentInBlock.ts +13 -0
  91. package/src/elevatedPayload/payloads/validateHashInBlock.ts +13 -0
  92. package/src/elevatedPayload/payloads/validateSchemaInBlock.ts +13 -0
  93. package/src/elevatedPayload/payloads/validateTransferInBlock.ts +14 -0
  94. package/src/elevatedPayload/validatePayloadInBlock.ts +37 -0
  95. package/src/hydratedBlock/index.ts +0 -1
  96. package/src/hydratedBlock/validateHydratedBlock.ts +6 -3
  97. package/src/hydratedBlock/validators/Payloads.ts +9 -36
  98. package/src/hydratedBlockState/validateHydratedBlockState.ts +4 -4
  99. package/src/hydratedBlockState/validators/RequiredBalance.ts +2 -2
  100. package/src/transaction/validateTransaction.ts +8 -9
  101. package/src/transaction/validators/TransactionElevationValidator.ts +12 -0
  102. package/src/transaction/validators/TransactionFromValidator.ts +16 -0
  103. package/src/transaction/validators/{TransactionJsonSchema.ts → TransactionJsonSchemaValidator.ts} +2 -1
  104. package/src/transaction/validators/{TransactionProtocol.ts → TransactionProtocolValidator.ts} +4 -6
  105. package/src/transaction/validators/index.ts +4 -3
  106. package/babel.config.json +0 -6
  107. package/dist/types/block/BlockValidationFunction.d.ts +0 -5
  108. package/dist/types/block/BlockValidationFunction.d.ts.map +0 -1
  109. package/dist/types/boundwitness/BoundWitnessValidationFunction.d.ts +0 -4
  110. package/dist/types/boundwitness/BoundWitnessValidationFunction.d.ts.map +0 -1
  111. package/dist/types/boundwitness/HydratedBoundWitnessValidationFunction.d.ts +0 -5
  112. package/dist/types/boundwitness/HydratedBoundWitnessValidationFunction.d.ts.map +0 -1
  113. package/dist/types/elevatedPayload/InBlockPayloadValidationFunction.d.ts +0 -6
  114. package/dist/types/elevatedPayload/InBlockPayloadValidationFunction.d.ts.map +0 -1
  115. package/dist/types/elevatedPayload/validateChainStakeIntentInBlock.d.ts +0 -3
  116. package/dist/types/elevatedPayload/validateChainStakeIntentInBlock.d.ts.map +0 -1
  117. package/dist/types/elevatedPayload/validateElevatedInBlock.d.ts +0 -3
  118. package/dist/types/elevatedPayload/validateElevatedInBlock.d.ts.map +0 -1
  119. package/dist/types/elevatedPayload/validateElevatedInTransaction.d.ts +0 -3
  120. package/dist/types/elevatedPayload/validateElevatedInTransaction.d.ts.map +0 -1
  121. package/dist/types/elevatedPayload/validateSchemaInBlock.d.ts +0 -3
  122. package/dist/types/elevatedPayload/validateSchemaInBlock.d.ts.map +0 -1
  123. package/dist/types/elevatedPayload/validateTransactionInBlock.d.ts +0 -3
  124. package/dist/types/elevatedPayload/validateTransactionInBlock.d.ts.map +0 -1
  125. package/dist/types/elevatedPayload/validateTransferInBlock.d.ts +0 -3
  126. package/dist/types/elevatedPayload/validateTransferInBlock.d.ts.map +0 -1
  127. package/dist/types/hydratedBlock/HydratedBlockValidationFunction.d.ts +0 -5
  128. package/dist/types/hydratedBlock/HydratedBlockValidationFunction.d.ts.map +0 -1
  129. package/dist/types/transaction/validators/TransactionElevation.d.ts.map +0 -1
  130. package/dist/types/transaction/validators/TransactionJsonSchema.d.ts.map +0 -1
  131. package/dist/types/transaction/validators/TransactionProtocol.d.ts.map +0 -1
  132. package/src/block/BlockValidationFunction.ts +0 -8
  133. package/src/boundwitness/BoundWitnessValidationFunction.ts +0 -6
  134. package/src/boundwitness/HydratedBoundWitnessValidationFunction.ts +0 -7
  135. package/src/elevatedPayload/InBlockPayloadValidationFunction.ts +0 -8
  136. package/src/elevatedPayload/validateChainStakeIntentInBlock.ts +0 -29
  137. package/src/elevatedPayload/validateElevatedInTransaction.ts +0 -23
  138. package/src/elevatedPayload/validateSchemaInBlock.ts +0 -24
  139. package/src/elevatedPayload/validateTransactionInBlock.ts +0 -18
  140. package/src/elevatedPayload/validateTransferInBlock.ts +0 -24
  141. package/src/hydratedBlock/HydratedBlockValidationFunction.ts +0 -8
  142. package/src/transaction/validators/TransactionElevation.ts +0 -28
@@ -0,0 +1,27 @@
1
+ import type { IdentityFunction } from '@xyo-network/chain-protocol'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
+ import { isStorageMeta } from '@xyo-network/payload-model'
4
+ import type { HydratedBlock } from '@xyo-network/xl1-model'
5
+
6
+ import { isElevatedFromBlock } from './isElevatedFromBlock.ts'
7
+ import { validateElevatedFromBlock } from './validateElevatedFromBlock.ts'
8
+ import { validateElevatedFromTransaction } from './validateElevatedFromTransaction.ts'
9
+
10
+ export const validateTypedPayloadInBlock = async <T extends Payload>(
11
+ payload: Payload,
12
+ block: HydratedBlock,
13
+ identityFunction: IdentityFunction<T>,
14
+ ): Promise<Error[]> => {
15
+ const errors: Error[] = []
16
+ if (identityFunction(payload) && isStorageMeta(payload)) {
17
+ if (isElevatedFromBlock(payload, block)) {
18
+ errors.push(...await validateElevatedFromBlock(payload, block))
19
+ } else {
20
+ errors.push(...await validateElevatedFromTransaction(payload, block))
21
+ }
22
+ } else {
23
+ errors.push(new Error('Payload failed identityFunction or isElevated or isStorageMeta'))
24
+ }
25
+ return errors
26
+ }
27
+ //
@@ -0,0 +1,4 @@
1
+ export * from './validateChainStakeIntentInBlock.ts'
2
+ export * from './validateHashInBlock.ts'
3
+ export * from './validateSchemaInBlock.ts'
4
+ export * from './validateTransferInBlock.ts'
@@ -0,0 +1,13 @@
1
+ import type { HydratedBlock, InBlockPayloadValidationFunction } from '@xyo-network/xl1-model'
2
+ import { isChainStakeIntent } from '@xyo-network/xl1-model'
3
+
4
+ import { validateTypedPayloadInBlock } from '../lib/index.ts'
5
+
6
+ export const validateChainStakeIntentInBlock: InBlockPayloadValidationFunction = async (
7
+ payload,
8
+ block: HydratedBlock,
9
+ ): Promise<Error[]> => {
10
+ const errors: Error[] = []
11
+ errors.push(...await validateTypedPayloadInBlock(payload, block, isChainStakeIntent))
12
+ return errors
13
+ }
@@ -0,0 +1,13 @@
1
+ import type { HydratedBlock, InBlockPayloadValidationFunction } from '@xyo-network/xl1-model'
2
+ import { isHashPayload } from '@xyo-network/xl1-model'
3
+
4
+ import { validateTypedPayloadInBlock } from '../lib/index.ts'
5
+
6
+ export const validateHashInBlock: InBlockPayloadValidationFunction = async (
7
+ payload,
8
+ block: HydratedBlock,
9
+ ): Promise<Error[]> => {
10
+ const errors: Error[] = []
11
+ errors.push(...await validateTypedPayloadInBlock(payload, block, isHashPayload))
12
+ return errors
13
+ }
@@ -0,0 +1,13 @@
1
+ import { isSchemaPayload } from '@xyo-network/schema-payload-plugin'
2
+ import type { HydratedBlock, InBlockPayloadValidationFunction } from '@xyo-network/xl1-model'
3
+
4
+ import { validateTypedPayloadInBlock } from '../lib/index.ts'
5
+
6
+ export const validateSchemaInBlock: InBlockPayloadValidationFunction = async (
7
+ payload,
8
+ block: HydratedBlock,
9
+ ): Promise<Error[]> => {
10
+ const errors: Error[] = []
11
+ errors.push(...await validateTypedPayloadInBlock(payload, block, isSchemaPayload))
12
+ return errors
13
+ }
@@ -0,0 +1,14 @@
1
+ import {
2
+ type HydratedBlock, type InBlockPayloadValidationFunction, isTransfer,
3
+ } from '@xyo-network/xl1-model'
4
+
5
+ import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
+
7
+ export const validateTransferInBlock: InBlockPayloadValidationFunction = async (
8
+ payload,
9
+ block: HydratedBlock,
10
+ ): Promise<Error[]> => {
11
+ const errors: Error[] = []
12
+ errors.push(...await validateTypedPayloadInBlock(payload, block, isTransfer))
13
+ return errors
14
+ }
@@ -0,0 +1,37 @@
1
+ import { BoundWitnessSchema } from '@xyo-network/boundwitness-model'
2
+ import type { Schema } from '@xyo-network/payload-model'
3
+ import { SchemaSchema } from '@xyo-network/schema-payload-plugin'
4
+ import type {
5
+ HydratedBlock,
6
+ InBlockPayloadValidationFunction,
7
+ } from '@xyo-network/xl1-model'
8
+ import {
9
+ ChainStakeIntentSchema, HashSchema, TransferSchema,
10
+ } from '@xyo-network/xl1-model'
11
+
12
+ import { validateTransactionInBlock } from './lib/index.ts'
13
+ import {
14
+ validateChainStakeIntentInBlock, validateHashInBlock, validateSchemaInBlock, validateTransferInBlock,
15
+ } from './payloads/index.ts'
16
+
17
+ const payloadValidators: Record<Schema, InBlockPayloadValidationFunction> = {
18
+ [HashSchema]: validateHashInBlock,
19
+ [TransferSchema]: validateTransferInBlock,
20
+ [SchemaSchema]: validateSchemaInBlock,
21
+ [ChainStakeIntentSchema]: validateChainStakeIntentInBlock,
22
+ [BoundWitnessSchema]: validateTransactionInBlock,
23
+ }
24
+
25
+ export const validatePayloadInBlock: InBlockPayloadValidationFunction = async (
26
+ payload,
27
+ block: HydratedBlock,
28
+ ): Promise<Error[]> => {
29
+ const errors: Error[] = []
30
+ const validator = payloadValidators[payload.schema]
31
+ if (validator) {
32
+ errors.push(...await validator(payload, block))
33
+ } else {
34
+ errors.push(new Error(`Unsupported payload schema: ${payload.schema}`))
35
+ }
36
+ return errors
37
+ }
@@ -1,3 +1,2 @@
1
- export * from './HydratedBlockValidationFunction.ts'
2
1
  export * from './validateHydratedBlock.ts'
3
2
  export * from './validators/index.ts'
@@ -1,9 +1,8 @@
1
1
  import type { Address } from '@xylabs/hex'
2
- import type { HydratedBlock } from '@xyo-network/xl1-model'
2
+ import type { HydratedBlock, HydratedBlockValidatorFunction } from '@xyo-network/xl1-model'
3
3
 
4
4
  import { validateBlock } from '../block/index.ts'
5
5
  import { BoundWitnessReferencesValidator } from '../boundwitness/index.ts'
6
- import type { HydratedBlockValidatorFunction } from './HydratedBlockValidationFunction.ts'
7
6
  import { PayloadsInBlockValidator } from './validators/index.ts'
8
7
 
9
8
  export const validateHydratedBlock: HydratedBlockValidatorFunction = async (
@@ -12,6 +11,10 @@ export const validateHydratedBlock: HydratedBlockValidatorFunction = async (
12
11
  additionalValidators: HydratedBlockValidatorFunction[] = [],
13
12
  ): Promise<Error[]> => {
14
13
  const errors: Error[] = await validateBlock(hydratedBlock[0], chainId)
15
- const validators: HydratedBlockValidatorFunction[] = [BoundWitnessReferencesValidator(), PayloadsInBlockValidator, ...additionalValidators]
14
+ const validators: HydratedBlockValidatorFunction[] = [
15
+ BoundWitnessReferencesValidator(),
16
+ PayloadsInBlockValidator,
17
+ ...additionalValidators,
18
+ ]
16
19
  return [...errors, ...(await Promise.all(validators.map(v => v(hydratedBlock, chainId)))).flat()]
17
20
  }
@@ -1,42 +1,18 @@
1
- import type { Address, Hash } from '@xylabs/hex'
2
- import { BoundWitnessSchema } from '@xyo-network/boundwitness-model'
1
+ import type { Hash } from '@xylabs/hex'
2
+ import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'
3
3
  import type {
4
- Payload, Schema, WithHashStorageMeta,
5
- } from '@xyo-network/payload-model'
6
- import { SchemaSchema } from '@xyo-network/schema-payload-plugin'
7
- import {
8
- ChainStakeIntentSchema,
9
- type FromFields,
10
- type HydratedBlock,
11
- TransferSchema,
4
+ HydratedBlock,
5
+ HydratedBlockValidatorFunction,
12
6
  } from '@xyo-network/xl1-model'
13
7
 
14
- import type { InBlockPayloadValidationFunction } from '../../elevatedPayload/index.ts'
15
- import {
16
- validateChainStakeIntentInBlock, validateSchemaInBlock, validateTransactionInBlock,
17
- validateTransferInBlock,
18
- } from '../../elevatedPayload/index.ts'
19
- import type { HydratedBlockValidatorFunction } from '../HydratedBlockValidationFunction.ts'
8
+ import { validatePayloadInBlock } from '../../elevatedPayload/validatePayloadInBlock.ts'
20
9
 
21
10
  export const PayloadsInBlockValidator: HydratedBlockValidatorFunction = async (
22
11
  [block, payloads]: HydratedBlock,
23
- chainId: Address,
24
12
  ) => {
25
13
  const errors: Error[] = []
26
14
 
27
- const validators: Record<Schema, InBlockPayloadValidationFunction> = {
28
- [TransferSchema]: validateTransferInBlock,
29
- [ChainStakeIntentSchema]: validateChainStakeIntentInBlock,
30
- [BoundWitnessSchema]: (payload) => {
31
- // TODO: Fix first block check with dual step singing
32
- console.error('TODO: Fix first block check with dual step singing')
33
- return block.block === 0 ? [] : validateTransactionInBlock(payload, [block, payloads], chainId)
34
- },
35
- [SchemaSchema]: validateSchemaInBlock,
36
- }
37
- const allowedSchemas = Object.keys(validators)
38
-
39
- const payloadMap: Record<Hash, WithHashStorageMeta<Payload & FromFields>> = {}
15
+ const payloadMap: Record<Hash, WithHashStorageMeta<Payload>> = {}
40
16
  for (const payload of payloads) {
41
17
  payloadMap[payload._hash] = payload
42
18
  }
@@ -44,12 +20,9 @@ export const PayloadsInBlockValidator: HydratedBlockValidatorFunction = async (
44
20
  for (let i = 0; i < block.payload_hashes.length; i++) {
45
21
  const hash = block.payload_hashes[i]
46
22
  const schema = block.payload_schemas[i]
47
- if (payloadMap[hash]) {
48
- if (allowedSchemas.includes(schema)) {
49
- errors.push(...(await validators[schema](payloadMap[hash], [block, payloads], chainId)))
50
- } else {
51
- errors.push(new Error(`invalid payload schema ${hash} ${schema}`))
52
- }
23
+ const payload = payloadMap[hash]
24
+ if (payload) {
25
+ errors.push(...await validatePayloadInBlock(payload, [block, payloads]))
53
26
  delete payloadMap[hash]
54
27
  } else {
55
28
  errors.push(new Error(`missing payload ${hash} ${schema}`))
@@ -1,17 +1,17 @@
1
1
  import type { Address } from '@xylabs/hex'
2
2
  import type { ReadArchivist } from '@xyo-network/archivist-model'
3
- import type { HydratedBlock, HydratedBlockStateValidatorFunction } from '@xyo-network/xl1-model'
3
+ import type { HydratedBlock, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-model'
4
4
 
5
5
  import { validateHydratedBlock } from '../hydratedBlock/index.ts'
6
6
  import { RequiredBalanceBlockStateValidator } from './validators/index.ts'
7
7
 
8
- export const validateHydratedBlockState: HydratedBlockStateValidatorFunction = async (
8
+ export const validateHydratedBlockState: HydratedBlockStateValidationFunction = async (
9
9
  hydratedBlock: HydratedBlock,
10
10
  chainId: Address,
11
11
  archivist: ReadArchivist,
12
- additionalValidators: HydratedBlockStateValidatorFunction[] = [],
12
+ additionalValidators: HydratedBlockStateValidationFunction[] = [],
13
13
  ): Promise<Error[]> => {
14
14
  const errors: Error[] = await validateHydratedBlock(hydratedBlock, chainId)
15
- const validators: HydratedBlockStateValidatorFunction[] = [RequiredBalanceBlockStateValidator, ...additionalValidators]
15
+ const validators: HydratedBlockStateValidationFunction[] = [RequiredBalanceBlockStateValidator, ...additionalValidators]
16
16
  return [...errors, ...(await Promise.all(validators.map(v => v(hydratedBlock, chainId, archivist)))).flat()]
17
17
  }
@@ -4,9 +4,9 @@ import type { ReadArchivist } from '@xyo-network/archivist-model'
4
4
  import {
5
5
  analyzeChain, BalanceAnalyzer, isChainSummaryBalances, netBalancesForPayloads,
6
6
  } from '@xyo-network/chain-protocol'
7
- import type { HydratedBlock, HydratedBlockStateValidatorFunction } from '@xyo-network/xl1-model'
7
+ import type { HydratedBlock, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-model'
8
8
 
9
- export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidatorFunction = async (
9
+ export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidationFunction = async (
10
10
  block: HydratedBlock,
11
11
  chainId: Address,
12
12
  archivist: ReadArchivist,
@@ -1,29 +1,28 @@
1
- import type {
2
- ChainIdentification, HydratedTransactionValidatorFunction,
3
- HydratedTransactionWithStorageMeta,
4
- } from '@xyo-network/xl1-model'
1
+ import type { Address } from '@xylabs/hex'
2
+ import type { HydratedTransactionValidatorFunction, HydratedTransactionWithStorageMeta } from '@xyo-network/xl1-model'
5
3
  import { isTransactionBoundWitness } from '@xyo-network/xl1-model'
6
4
 
7
5
  import { BoundWitnessReferencesValidator } from '../boundwitness/index.ts'
8
6
  import {
9
- TransactionElevationValidator, TransactionJsonSchemaValidator, TransactionProtocolValidator,
7
+ TransactionElevationValidator, TransactionFromValidator, TransactionJsonSchemaValidator, TransactionProtocolValidator,
10
8
  } from './validators/index.ts'
11
9
 
12
10
  export async function validateTransaction(
13
11
  tx: HydratedTransactionWithStorageMeta,
14
- chainIdentification: ChainIdentification,
12
+ chainId: Address,
15
13
  additionalValidators: HydratedTransactionValidatorFunction[] = [],
16
14
  ): Promise<Error[]> {
17
- if (!isTransactionBoundWitness(tx)) {
15
+ if (!isTransactionBoundWitness(tx[0])) {
18
16
  return [new Error('failed isTransactionBoundWitness identity check')]
19
17
  }
20
18
 
21
19
  const validators: HydratedTransactionValidatorFunction[] = [
22
20
  TransactionProtocolValidator,
23
- TransactionJsonSchemaValidator,
21
+ // TransactionJsonSchemaValidator, // TODO: Figure out why this is failing
22
+ TransactionFromValidator,
24
23
  TransactionElevationValidator,
25
24
  BoundWitnessReferencesValidator(),
26
25
  ...additionalValidators,
27
26
  ]
28
- return (await Promise.all(validators.map(v => v(tx, chainIdentification)))).flat()
27
+ return (await Promise.all(validators.map(v => v(tx, chainId)))).flat()
29
28
  }
@@ -0,0 +1,12 @@
1
+ import type { Promisable } from '@xylabs/promise'
2
+ import type {
3
+ HydratedTransactionValidatorFunction, HydratedTransactionWithStorageMeta, TransactionBoundWitness,
4
+ } from '@xyo-network/xl1-model'
5
+
6
+ export const TransactionElevationValidator: HydratedTransactionValidatorFunction<TransactionBoundWitness> = (
7
+ [_tx, _txPayloads]: HydratedTransactionWithStorageMeta,
8
+ ): Promisable<Error[]> => {
9
+ const errors: Error[] = []
10
+ // TODO: Add validation for transaction elevation
11
+ return errors
12
+ }
@@ -0,0 +1,16 @@
1
+ import { type Address, asAddress } from '@xylabs/hex'
2
+ import { addressesContains } from '@xyo-network/boundwitness-validator'
3
+ import type {
4
+ HydratedTransaction, HydratedTransactionValidatorFunction, TransactionBoundWitness,
5
+ } from '@xyo-network/xl1-model'
6
+
7
+ export const TransactionFromValidator: HydratedTransactionValidatorFunction<TransactionBoundWitness> = (
8
+ [tx]: HydratedTransaction,
9
+ _chainId: Address,
10
+ ): Error[] => {
11
+ const errors: Error[] = []
12
+ const from = asAddress(tx.from)
13
+ if (from === undefined)errors.push(new Error('Transaction from is not a valid address'))
14
+ else if (!addressesContains(tx, from)) errors.push(new Error('Transaction from address must be listed in addresses'))
15
+ return errors
16
+ }
@@ -1,5 +1,6 @@
1
1
  import type { Promisable } from '@xylabs/promise'
2
2
  import { TransactionBoundWitnessJsonSchema } from '@xyo-network/chain-schema'
3
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
3
4
  import type {
4
5
  HydratedTransaction, HydratedTransactionValidatorFunction, TransactionBoundWitness,
5
6
  } from '@xyo-network/xl1-model'
@@ -13,7 +14,7 @@ export const TransactionJsonSchemaValidator: HydratedTransactionValidatorFunctio
13
14
  const ajv = new Ajv({ allErrors: true, strict: true })
14
15
  // see if you can export the super set
15
16
  const validate = ajv.compile(TransactionBoundWitnessJsonSchema)
16
- if (!validate(tx)) {
17
+ if (!validate(PayloadBuilder.omitStorageMeta(tx))) {
17
18
  const error = new Error('failed JSON schema validation')
18
19
  error.cause = validate.errors
19
20
  errors.push(error)
@@ -1,23 +1,21 @@
1
+ import type { Address } from '@xylabs/hex'
1
2
  import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
2
3
  import type {
3
- ChainIdentification, HydratedTransaction, HydratedTransactionValidatorFunction, TransactionBoundWitness,
4
+ HydratedTransaction, HydratedTransactionValidatorFunction, TransactionBoundWitness,
4
5
  } from '@xyo-network/xl1-model'
5
6
 
6
7
  export const TransactionProtocolValidator: HydratedTransactionValidatorFunction<TransactionBoundWitness> = async (
7
8
  [tx]: HydratedTransaction,
8
- chainIdentification?: ChainIdentification,
9
+ chainId: Address,
9
10
  ): Promise<Error[]> => {
10
11
  const errors: Error[] = []
11
12
  try {
12
13
  if (!await BoundWitnessWrapper.parse(tx).getValid()) {
13
14
  errors.push(new Error('failed basic boundwitness parse'))
14
15
  }
15
- if (chainIdentification && tx.chain !== chainIdentification.id) {
16
+ if (chainId && tx.chain !== chainId) {
16
17
  errors.push(new Error('invalid chain id'))
17
18
  }
18
- if (tx.nonce.length !== tx.addresses.length) {
19
- errors.push(new Error('invalid nonce length'))
20
- }
21
19
  } catch (ex) {
22
20
  errors.push(new Error('validation excepted'), ex as Error)
23
21
  }
@@ -1,3 +1,4 @@
1
- export * from './TransactionElevation.ts'
2
- export * from './TransactionJsonSchema.ts'
3
- export * from './TransactionProtocol.ts'
1
+ export * from './TransactionElevationValidator.ts'
2
+ export * from './TransactionFromValidator.ts'
3
+ export * from './TransactionJsonSchemaValidator.ts'
4
+ export * from './TransactionProtocolValidator.ts'
package/babel.config.json DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "presets": [
3
- ["@babel/preset-env", { "modules": false, "targets": { "node": "current" } }],
4
- "@babel/preset-typescript"
5
- ]
6
- }
@@ -1,5 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- import type { Promisable } from '@xylabs/promise';
3
- import type { BlockBoundWitness } from '@xyo-network/xl1-model';
4
- export type BlockValidatorFunction = (block: BlockBoundWitness, chainId?: Address) => Promisable<Error[]>;
5
- //# sourceMappingURL=BlockValidationFunction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BlockValidationFunction.d.ts","sourceRoot":"","sources":["../../../src/block/BlockValidationFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,MAAM,MAAM,sBAAsB,GAAG,CACnC,KAAK,EAAE,iBAAiB,EACxB,OAAO,CAAC,EAAE,OAAO,KACd,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { Promisable } from '@xylabs/promise';
2
- import type { BoundWitness } from '@xyo-network/boundwitness-model';
3
- export type BoundWitnessValidationFunction<T extends BoundWitness = BoundWitness> = (bw: T) => Promisable<Error[]>;
4
- //# sourceMappingURL=BoundWitnessValidationFunction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BoundWitnessValidationFunction.d.ts","sourceRoot":"","sources":["../../../src/boundwitness/BoundWitnessValidationFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAEnE,MAAM,MAAM,8BAA8B,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CAClF,EAAE,EAAE,CAAC,KACF,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA"}
@@ -1,5 +0,0 @@
1
- import type { Promisable } from '@xylabs/promise';
2
- import type { HydratedBoundWitnessWithStorageMeta } from '@xyo-network/archivist-model';
3
- import type { BoundWitness } from '@xyo-network/boundwitness-model';
4
- export type HydratedBoundWitnessValidationFunction<T extends BoundWitness = BoundWitness> = (bw: HydratedBoundWitnessWithStorageMeta<T>) => Promisable<Error[]>;
5
- //# sourceMappingURL=HydratedBoundWitnessValidationFunction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HydratedBoundWitnessValidationFunction.d.ts","sourceRoot":"","sources":["../../../src/boundwitness/HydratedBoundWitnessValidationFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,mCAAmC,EAAE,MAAM,8BAA8B,CAAA;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAEnE,MAAM,MAAM,sCAAsC,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CAC1F,EAAE,EAAE,mCAAmC,CAAC,CAAC,CAAC,KACvC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA"}
@@ -1,6 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- import type { Promisable } from '@xylabs/promise';
3
- import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model';
4
- import type { FromFields, HydratedBlock } from '@xyo-network/xl1-model';
5
- export type InBlockPayloadValidationFunction = (payload: WithHashStorageMeta<Payload<FromFields>>, block: HydratedBlock, chainId: Address) => Promisable<Error[]>;
6
- //# sourceMappingURL=InBlockPayloadValidationFunction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InBlockPayloadValidationFunction.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/InBlockPayloadValidationFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEvE,MAAM,MAAM,gCAAgC,GAAG,CAC7C,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,KACtF,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateChainStakeIntentInBlock: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateChainStakeIntentInBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateChainStakeIntentInBlock.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateChainStakeIntentInBlock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAI7F,eAAO,MAAM,+BAA+B,EAAE,gCAoB7C,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateElevatedInBlock: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateElevatedInBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateElevatedInBlock.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateElevatedInBlock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAE7F,eAAO,MAAM,uBAAuB,EAAE,gCAUrC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateElevatedInTransaction: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateElevatedInTransaction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateElevatedInTransaction.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateElevatedInTransaction.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAE7F,eAAO,MAAM,6BAA6B,EAAE,gCAgB3C,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateSchemaInBlock: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateSchemaInBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateSchemaInBlock.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateSchemaInBlock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAI7F,eAAO,MAAM,qBAAqB,EAAE,gCAenC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateTransactionInBlock: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateTransactionInBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateTransactionInBlock.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateTransactionInBlock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAE7F,eAAO,MAAM,0BAA0B,EAAE,gCAWxC,CAAA"}
@@ -1,3 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts';
2
- export declare const validateTransferInBlock: InBlockPayloadValidationFunction;
3
- //# sourceMappingURL=validateTransferInBlock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validateTransferInBlock.d.ts","sourceRoot":"","sources":["../../../src/elevatedPayload/validateTransferInBlock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAI7F,eAAO,MAAM,uBAAuB,EAAE,gCAerC,CAAA"}
@@ -1,5 +0,0 @@
1
- import type { Address } from '@xylabs/hex';
2
- import type { Promisable } from '@xylabs/promise';
3
- import type { HydratedBlock } from '@xyo-network/xl1-model';
4
- export type HydratedBlockValidatorFunction = (hydratedBlock: HydratedBlock, chainId: Address) => Promisable<Error[]>;
5
- //# sourceMappingURL=HydratedBlockValidationFunction.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HydratedBlockValidationFunction.d.ts","sourceRoot":"","sources":["../../../src/hydratedBlock/HydratedBlockValidationFunction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,8BAA8B,GAAG,CAC3C,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,KACb,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionElevation.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionElevation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oCAAoC,EAAsC,uBAAuB,EAClG,MAAM,wBAAwB,CAAA;AAE/B,eAAO,MAAM,6BAA6B,EAAE,oCAAoC,CAAC,uBAAuB,CAqBvG,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionJsonSchema.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionJsonSchema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACW,oCAAoC,EAAE,uBAAuB,EACnF,MAAM,wBAAwB,CAAA;AAG/B,eAAO,MAAM,8BAA8B,EAAE,oCAAoC,CAAC,uBAAuB,CAiBxG,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionProtocol.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionProtocol.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACgC,oCAAoC,EAAE,uBAAuB,EACxG,MAAM,wBAAwB,CAAA;AAE/B,eAAO,MAAM,4BAA4B,EAAE,oCAAoC,CAAC,uBAAuB,CAmBtG,CAAA"}
@@ -1,8 +0,0 @@
1
- import type { Address } from '@xylabs/hex'
2
- import type { Promisable } from '@xylabs/promise'
3
- import type { BlockBoundWitness } from '@xyo-network/xl1-model'
4
-
5
- export type BlockValidatorFunction = (
6
- block: BlockBoundWitness,
7
- chainId?: Address,
8
- ) => Promisable<Error[]>
@@ -1,6 +0,0 @@
1
- import type { Promisable } from '@xylabs/promise'
2
- import type { BoundWitness } from '@xyo-network/boundwitness-model'
3
-
4
- export type BoundWitnessValidationFunction<T extends BoundWitness = BoundWitness> = (
5
- bw: T
6
- ) => Promisable<Error[]>
@@ -1,7 +0,0 @@
1
- import type { Promisable } from '@xylabs/promise'
2
- import type { HydratedBoundWitnessWithStorageMeta } from '@xyo-network/archivist-model'
3
- import type { BoundWitness } from '@xyo-network/boundwitness-model'
4
-
5
- export type HydratedBoundWitnessValidationFunction<T extends BoundWitness = BoundWitness> = (
6
- bw: HydratedBoundWitnessWithStorageMeta<T>
7
- ) => Promisable<Error[]>
@@ -1,8 +0,0 @@
1
- import type { Address } from '@xylabs/hex'
2
- import type { Promisable } from '@xylabs/promise'
3
- import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'
4
- import type { FromFields, HydratedBlock } from '@xyo-network/xl1-model'
5
-
6
- export type InBlockPayloadValidationFunction = (
7
- payload: WithHashStorageMeta<Payload<FromFields>>, block: HydratedBlock, chainId: Address
8
- ) => Promisable<Error[]>
@@ -1,29 +0,0 @@
1
- import type { Address } from '@xylabs/hex'
2
- import type { HydratedBlock } from '@xyo-network/xl1-model'
3
- import { isChainStakeIntent } from '@xyo-network/xl1-model'
4
-
5
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts'
6
- import { validateElevatedInBlock } from './validateElevatedInBlock.ts'
7
- import { validateElevatedInTransaction } from './validateElevatedInTransaction.ts'
8
-
9
- export const validateChainStakeIntentInBlock: InBlockPayloadValidationFunction = async (
10
- payload,
11
- block: HydratedBlock,
12
- chainId: Address,
13
- ): Promise<Error[]> => {
14
- const errors: Error[] = []
15
- if (!isChainStakeIntent(payload)) {
16
- errors.push(new Error('Payload is not a chain stake intent'))
17
- }
18
-
19
- if (!block[0].payload_hashes.includes(payload._hash)) {
20
- errors.push(new Error('ChainStakeIntent not included in block'))
21
- }
22
-
23
- if (block[0].addresses.includes(payload.from)) {
24
- errors.push(...await validateElevatedInBlock(payload, block, chainId))
25
- } else {
26
- errors.push(...await validateElevatedInTransaction(payload, block, chainId))
27
- }
28
- return errors
29
- }
@@ -1,23 +0,0 @@
1
- import type { Promisable } from '@xylabs/promise'
2
- import { transactionsFromHydratedBlock } from '@xyo-network/chain-protocol'
3
- import type { HydratedBlock } from '@xyo-network/xl1-model'
4
-
5
- import type { InBlockPayloadValidationFunction } from './InBlockPayloadValidationFunction.ts'
6
-
7
- export const validateElevatedInTransaction: InBlockPayloadValidationFunction = (
8
- payload,
9
- block: HydratedBlock,
10
- ): Promisable<Error[]> => {
11
- const errors: Error[] = []
12
- const txs = transactionsFromHydratedBlock(block)
13
- const fromTxs = txs.filter(tx => tx.addresses.includes(payload.from))
14
- if (fromTxs.length > 0) {
15
- const hashes = fromTxs.flatMap(tx => tx.payload_hashes)
16
- if (!hashes.includes(payload._hash)) {
17
- errors.push(new Error('Transaction does not include payload'))
18
- }
19
- } else {
20
- errors.push(new Error(`Missing transaction for from address ${payload.from} [${payload.schema}]`))
21
- }
22
- return errors
23
- }