@xyo-network/chain-validation 1.20.14 → 1.20.16

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 (36) hide show
  1. package/README.md +9 -200
  2. package/package.json +116 -24
  3. package/src/block/index.ts +0 -2
  4. package/src/block/validateBlock.ts +0 -39
  5. package/src/block/validators/AllowedPayloadSchemas.ts +0 -33
  6. package/src/block/validators/Fields.ts +0 -47
  7. package/src/block/validators/JsonSchema.ts +0 -40
  8. package/src/block/validators/PreviousHash.ts +0 -37
  9. package/src/block/validators/index.ts +0 -4
  10. package/src/elevatedPayload/index.ts +0 -1
  11. package/src/elevatedPayload/lib/index.ts +0 -6
  12. package/src/elevatedPayload/lib/isElevatedFromBlock.ts +0 -12
  13. package/src/elevatedPayload/lib/validateElevatedFromBlock.ts +0 -25
  14. package/src/elevatedPayload/lib/validateElevatedFromTransaction.ts +0 -30
  15. package/src/elevatedPayload/lib/validateIncludedInBlock.ts +0 -14
  16. package/src/elevatedPayload/lib/validateTransactionInBlock.ts +0 -43
  17. package/src/elevatedPayload/lib/validateTypedPayloadInBlock.ts +0 -32
  18. package/src/elevatedPayload/payloads/index.ts +0 -8
  19. package/src/elevatedPayload/payloads/validateBridgeDestinationObservationInBlock.ts +0 -28
  20. package/src/elevatedPayload/payloads/validateBridgeIntentInBlock.ts +0 -28
  21. package/src/elevatedPayload/payloads/validateBridgeSourceObservationInBlock.ts +0 -28
  22. package/src/elevatedPayload/payloads/validateChainStakeIntentInBlock.ts +0 -28
  23. package/src/elevatedPayload/payloads/validateHashInBlock.ts +0 -28
  24. package/src/elevatedPayload/payloads/validateSchemaInBlock.ts +0 -29
  25. package/src/elevatedPayload/payloads/validateTimeInBlock.ts +0 -28
  26. package/src/elevatedPayload/payloads/validateTransferInBlock.ts +0 -28
  27. package/src/elevatedPayload/validatePayloadInBlock.ts +0 -53
  28. package/src/hydratedBlock/index.ts +0 -2
  29. package/src/hydratedBlock/validateHydratedBlock.ts +0 -49
  30. package/src/hydratedBlock/validators/Payloads.ts +0 -54
  31. package/src/hydratedBlock/validators/index.ts +0 -1
  32. package/src/hydratedBlockState/index.ts +0 -2
  33. package/src/hydratedBlockState/validateHydratedBlockState.ts +0 -44
  34. package/src/hydratedBlockState/validators/RequiredBalance.ts +0 -59
  35. package/src/hydratedBlockState/validators/index.ts +0 -1
  36. package/src/index.ts +0 -3
@@ -1,30 +0,0 @@
1
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
2
- import { InBlockPayloadValidationError, transactionsFromHydratedBlock } from '@xyo-network/xl1-sdk'
3
-
4
- export const validateElevatedFromTransaction: InBlockPayloadValidationFunction = (
5
- context,
6
- payload,
7
- block,
8
- ) => {
9
- const errors: InBlockPayloadValidationError[] = []
10
- try {
11
- const txs = transactionsFromHydratedBlock(block)
12
- if (txs.length > 0) {
13
- const hashes = txs.flatMap(tx => tx.payload_hashes)
14
- if (!hashes.includes(payload._hash)) {
15
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, 'Transaction does not include payload'))
16
- }
17
- } else {
18
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, 'No Transactions in block'))
19
- }
20
- } catch (ex) {
21
- errors.push(new InBlockPayloadValidationError(
22
- payload._hash,
23
- block,
24
- payload,
25
- `Failed validateElevatedFromTransaction: ${ex}`,
26
- ex,
27
- ))
28
- }
29
- return errors
30
- }
@@ -1,14 +0,0 @@
1
- import type { Payload, WithStorageMeta } from '@xyo-network/sdk-js'
2
- import type { BlockBoundWitness } from '@xyo-network/xl1-sdk'
3
-
4
- export const validateIncludedInBlock = (payload: WithStorageMeta<Payload>, block: BlockBoundWitness): Error[] => {
5
- const errors: Error[] = []
6
- try {
7
- if (!block.payload_hashes.includes(payload._hash)) {
8
- errors.push(new Error('Payload not included in block'))
9
- }
10
- } catch (ex) {
11
- errors.push(new Error(`Failed validateIncludedInBlock: ${ex}`))
12
- }
13
- return errors
14
- }
@@ -1,43 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import { isHashMeta } from '@xyo-network/sdk-js'
3
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
4
- import {
5
- BoundWitnessSignaturesValidator, InBlockPayloadValidationError, isTransactionBoundWitness, validateTransaction,
6
- } from '@xyo-network/xl1-sdk'
7
-
8
- export const validateTransactionInBlock: InBlockPayloadValidationFunction = async (
9
- context,
10
- payload,
11
- block,
12
- ): Promise<InBlockPayloadValidationError[]> => {
13
- const errors: InBlockPayloadValidationError[] = []
14
- try {
15
- if (isTransactionBoundWitness(payload) && isHashMeta(payload)) {
16
- const txErrors = await validateTransaction({ ...context, chainId: block[0].chain }, [payload, block[1]])
17
- for (const txError of txErrors) {
18
- errors.push(new InBlockPayloadValidationError(
19
- payload._hash,
20
- block,
21
- payload,
22
- `TransactionValidation error: ${txError}`,
23
- txError,
24
- ))
25
- }
26
- const txSignatureErrors = await BoundWitnessSignaturesValidator(payload)
27
- for (const txSignatureError of txSignatureErrors) {
28
- errors.push(new InBlockPayloadValidationError(
29
- payload._hash,
30
- block,
31
- payload,
32
- `BoundWitnessSignaturesValidator error: ${txSignatureError}`,
33
- txSignatureError,
34
- ))
35
- }
36
- } else {
37
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, 'Payload failed isTransactionBoundWitness or isHashMeta'))
38
- }
39
- } catch (ex) {
40
- errors.push(new InBlockPayloadValidationError(payload._hash ?? ZERO_HASH, block, payload, `validation excepted: ${ex}`, ex))
41
- }
42
- return errors
43
- }
@@ -1,32 +0,0 @@
1
- import type { IdentityFunction } from '@xylabs/sdk-js'
2
- import type { Payload } from '@xyo-network/sdk-js'
3
- import { isHashMeta } from '@xyo-network/sdk-js'
4
- import type { HydratedBlockWithHashMeta, InBlockPayloadValidationFunctionContext } from '@xyo-network/xl1-sdk'
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
- context: InBlockPayloadValidationFunctionContext,
12
- payload: Payload,
13
- block: HydratedBlockWithHashMeta,
14
- identityFunction: IdentityFunction<T>,
15
- ): Promise<Error[]> => {
16
- const errors: Error[] = []
17
- try {
18
- if (identityFunction(payload) && isHashMeta(payload)) {
19
- if (isElevatedFromBlock(payload, block)) {
20
- errors.push(...await validateElevatedFromBlock(context, payload, block))
21
- } else {
22
- errors.push(...await validateElevatedFromTransaction(context, payload, block))
23
- }
24
- } else {
25
- errors.push(new Error('Payload failed identityFunction or isElevated or isStorageMeta'))
26
- }
27
- } catch (ex) {
28
- errors.push(new Error(`Failed validateTypedPayloadInBlock: ${ex}`))
29
- }
30
- return errors
31
- }
32
- //
@@ -1,8 +0,0 @@
1
- export * from './validateBridgeDestinationObservationInBlock.ts'
2
- export * from './validateBridgeIntentInBlock.ts'
3
- export * from './validateBridgeSourceObservationInBlock.ts'
4
- export * from './validateChainStakeIntentInBlock.ts'
5
- export * from './validateHashInBlock.ts'
6
- export * from './validateSchemaInBlock.ts'
7
- export * from './validateTimeInBlock.ts'
8
- export * from './validateTransferInBlock.ts'
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isBridgeDestinationObservation } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateBridgeDestinationObservationInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isBridgeDestinationObservation)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `Failed validateBridgeObservationInBlock: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isBridgeIntent } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateBridgeIntentInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isBridgeIntent)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `Failed validateBridgeIntentInBlock: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isBridgeSourceObservation } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateBridgeSourceObservationInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isBridgeSourceObservation)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `Failed validateBridgeObservationInBlock: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isChainStakeIntent } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateChainStakeIntentInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isChainStakeIntent)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- block[0]?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `validation excepted: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isHashPayload } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateHashInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: (InBlockPayloadValidationError)[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isHashPayload)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `validation excepted: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,29 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import { isSchemaPayload } from '@xyo-network/sdk-js'
3
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
4
- import { InBlockPayloadValidationError } from '@xyo-network/xl1-sdk'
5
-
6
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
7
-
8
- export const validateSchemaInBlock: InBlockPayloadValidationFunction = async (
9
- context,
10
- payload,
11
- block,
12
- ) => {
13
- const errors: InBlockPayloadValidationError[] = []
14
- try {
15
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isSchemaPayload)
16
- for (const typedError of typedErrors) {
17
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
18
- }
19
- } catch (ex) {
20
- errors.push(new InBlockPayloadValidationError(
21
- (block?.[0])?._hash ?? ZERO_HASH,
22
- block,
23
- payload,
24
- `Failed validateSchemaInBlock: ${ex}`,
25
- ex,
26
- ))
27
- }
28
- return errors
29
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isTimePayload } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateTimeInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isTimePayload)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `Failed validateTimeInBlock: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,28 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { InBlockPayloadValidationError, isTransfer } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateTypedPayloadInBlock } from '../lib/index.ts'
6
-
7
- export const validateTransferInBlock: InBlockPayloadValidationFunction = async (
8
- context,
9
- payload,
10
- block,
11
- ) => {
12
- const errors: InBlockPayloadValidationError[] = []
13
- try {
14
- const typedErrors = await validateTypedPayloadInBlock(context, payload, block, isTransfer)
15
- for (const typedError of typedErrors) {
16
- errors.push(new InBlockPayloadValidationError(payload._hash, block, payload, `validateTypedPayloadInBlock error: ${typedError}`, typedError))
17
- }
18
- } catch (ex) {
19
- errors.push(new InBlockPayloadValidationError(
20
- (block?.[0])?._hash ?? ZERO_HASH,
21
- block,
22
- payload,
23
- `Failed validateTransferInBlock: ${ex}`,
24
- ex,
25
- ))
26
- }
27
- return errors
28
- }
@@ -1,53 +0,0 @@
1
- import { ZERO_HASH } from '@xylabs/sdk-js'
2
- import { BoundWitnessSchema } from '@xyo-network/boundwitness-model'
3
- import type { Schema } from '@xyo-network/sdk-js'
4
- import { SchemaSchema } from '@xyo-network/sdk-js'
5
- import type { InBlockPayloadValidationFunction } from '@xyo-network/xl1-sdk'
6
- import {
7
- BridgeDestinationObservationSchema, BridgeIntentSchema, BridgeSourceObservationSchema, ChainStakeIntentSchema, HashSchema, InBlockPayloadValidationError,
8
- TimeSchema, TransferSchema,
9
- } from '@xyo-network/xl1-sdk'
10
-
11
- import { validateTransactionInBlock } from './lib/index.ts'
12
- import {
13
- validateBridgeDestinationObservationInBlock, validateBridgeIntentInBlock, validateBridgeSourceObservationInBlock, validateChainStakeIntentInBlock,
14
- validateHashInBlock, validateSchemaInBlock, validateTimeInBlock, validateTransferInBlock,
15
- } from './payloads/index.ts'
16
-
17
- const payloadValidators: Partial<Record<Schema, InBlockPayloadValidationFunction>> = {
18
- [BoundWitnessSchema]: validateTransactionInBlock,
19
- [BridgeDestinationObservationSchema]: validateBridgeDestinationObservationInBlock,
20
- [BridgeIntentSchema]: validateBridgeIntentInBlock,
21
- [BridgeSourceObservationSchema]: validateBridgeSourceObservationInBlock,
22
- [ChainStakeIntentSchema]: validateChainStakeIntentInBlock,
23
- [HashSchema]: validateHashInBlock,
24
- [SchemaSchema]: validateSchemaInBlock,
25
- [TimeSchema]: validateTimeInBlock,
26
- [TransferSchema]: validateTransferInBlock,
27
- }
28
-
29
- export const validatePayloadInBlock: InBlockPayloadValidationFunction = async (
30
- context,
31
- payload,
32
- block,
33
- ): Promise<InBlockPayloadValidationError[]> => {
34
- const errors: InBlockPayloadValidationError[] = []
35
- try {
36
- const validator = payloadValidators[payload.schema]
37
- if (validator) {
38
- errors.push(...await validator(context, payload, block))
39
- } else {
40
- errors.push(new InBlockPayloadValidationError((block?.[0])?._hash ?? ZERO_HASH, block, payload, `Unsupported payload schema: ${payload.schema}`))
41
- }
42
- } catch (ex) {
43
- const error = new InBlockPayloadValidationError(
44
- (block?.[0])?._hash ?? ZERO_HASH,
45
- block,
46
- payload,
47
- `validation excepted: ${ex}`,
48
- ex,
49
- )
50
- errors.push(error)
51
- }
52
- return errors
53
- }
@@ -1,2 +0,0 @@
1
- export * from './validateHydratedBlock.ts'
2
- export * from './validators/index.ts'
@@ -1,49 +0,0 @@
1
- import type { Promisable } from '@xylabs/sdk-js'
2
- import { ZERO_HASH } from '@xylabs/sdk-js'
3
- import type {
4
- BaseContext,
5
- BlockValidatorFunction, ChainId, HydratedBlockValidationFunction, HydratedBlockWithHashMeta,
6
- XL1BlockNumber,
7
- } from '@xyo-network/xl1-sdk'
8
- import { BoundWitnessReferencesValidator, HydratedBlockValidationError } from '@xyo-network/xl1-sdk'
9
-
10
- import { validateBlock } from '../block/index.ts'
11
- import { PayloadsInBlockValidator } from './validators/index.ts'
12
-
13
- export const validateHydratedBlock = async (
14
- context: BaseContext,
15
- hydratedBlock: HydratedBlockWithHashMeta,
16
- chainIdAtBlockNumber?: (blockNumber: XL1BlockNumber) => Promisable<ChainId>,
17
- additionalValidators: HydratedBlockValidationFunction[] = [],
18
- additionalBlockValidators: BlockValidatorFunction[] = [],
19
- ) => {
20
- const errors: HydratedBlockValidationError[] = []
21
- try {
22
- const validateBlockErrors = await validateBlock(
23
- context,
24
- hydratedBlock[0],
25
- chainIdAtBlockNumber ? await chainIdAtBlockNumber(hydratedBlock[0].block) : undefined,
26
- additionalBlockValidators,
27
- )
28
- for (const validateBlockError of validateBlockErrors) {
29
- errors.push(new HydratedBlockValidationError(hydratedBlock[0]._hash, hydratedBlock, `validateBlock error: ${validateBlockError}`, validateBlockError))
30
- }
31
- const bwRefErrors = await BoundWitnessReferencesValidator()(hydratedBlock)
32
- for (const bwRefError of bwRefErrors) {
33
- errors.push(new HydratedBlockValidationError(hydratedBlock[0]._hash, hydratedBlock, `boundwitness reference error: ${bwRefError}`, bwRefError))
34
- }
35
- const validators: HydratedBlockValidationFunction[] = [
36
- PayloadsInBlockValidator,
37
- ...additionalValidators,
38
- ]
39
- errors.push(...(await Promise.all(validators.map(v => v(context, hydratedBlock, chainIdAtBlockNumber)))).flat())
40
- } catch (ex) {
41
- errors.push(new HydratedBlockValidationError(
42
- hydratedBlock?.[0]?._hash ?? ZERO_HASH,
43
- hydratedBlock,
44
- `Failed validateHydratedBlock: ${ex}`,
45
- ex,
46
- ))
47
- }
48
- return errors
49
- }
@@ -1,54 +0,0 @@
1
- import { type Hash, ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { Payload, WithHashMeta } from '@xyo-network/sdk-js'
3
- import type { HydratedBlockValidationFunction } from '@xyo-network/xl1-sdk'
4
- import { HydratedBlockValidationError } from '@xyo-network/xl1-sdk'
5
-
6
- import { validatePayloadInBlock } from '../../elevatedPayload/index.ts'
7
-
8
- export const PayloadsInBlockValidator: HydratedBlockValidationFunction = async (
9
- context,
10
- [block, payloads],
11
- ) => {
12
- const errors: HydratedBlockValidationError[] = []
13
- try {
14
- const payloadMap: Partial<Record<Hash, WithHashMeta<Payload>>> = {}
15
- for (const payload of payloads) {
16
- payloadMap[payload._hash] = payload
17
- }
18
-
19
- const remainingPayloads = { ...payloadMap }
20
-
21
- for (let i = 0; i < block.payload_hashes.length; i++) {
22
- const hash = block.payload_hashes[i]
23
- const schema = block.payload_schemas[i]
24
- const payload = payloadMap[hash]
25
- if (payload) {
26
- const payloadInBlockErrors = await validatePayloadInBlock(context, payload, [block, payloads])
27
- for (const payloadInBlockError of payloadInBlockErrors) {
28
- errors.push(new HydratedBlockValidationError(
29
- block?._hash ?? ZERO_HASH,
30
- [block, payloads],
31
- `validatePayloadInBlock error: ${payloadInBlockError}`,
32
- payloadInBlockError,
33
- ))
34
- }
35
- delete remainingPayloads[hash]
36
- } else {
37
- errors.push(new HydratedBlockValidationError(block?._hash ?? ZERO_HASH, [block, payloads], `missing payload ${hash} ${schema}`))
38
- }
39
- }
40
-
41
- if (Object.keys(remainingPayloads).length > 0) {
42
- errors.push(new HydratedBlockValidationError(block?._hash ?? ZERO_HASH, [block, payloads], `extra payloads ${Object.keys(payloadMap).join(', ')}`))
43
- }
44
- } catch (ex) {
45
- errors.push(new HydratedBlockValidationError(
46
- block?._hash ?? ZERO_HASH,
47
- [block, payloads],
48
- `Failed PayloadsInBlockValidator: ${ex}`,
49
- ex,
50
- ))
51
- }
52
-
53
- return errors
54
- }
@@ -1 +0,0 @@
1
- export * from './Payloads.ts'
@@ -1,2 +0,0 @@
1
- export * from './validateHydratedBlockState.ts'
2
- export * from './validators/index.ts'
@@ -1,44 +0,0 @@
1
- import { spanRootAsync, ZERO_HASH } from '@xylabs/sdk-js'
2
- import type { ChainId, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-sdk'
3
- import { HydratedBlockStateValidationError } from '@xyo-network/xl1-sdk'
4
-
5
- import { validateHydratedBlock } from '../hydratedBlock/index.ts'
6
- import { RequiredBalanceBlockStateValidator } from './validators/index.ts'
7
-
8
- export const validateHydratedBlockState: HydratedBlockStateValidationFunction = async (
9
- context,
10
- hydratedBlock,
11
- additionalValidators = [],
12
- ) => {
13
- return await spanRootAsync('validateHydratedBlockState', async () => {
14
- const errors: HydratedBlockStateValidationError[] = []
15
- let chainId: ChainId | undefined
16
- try {
17
- chainId = await context.chainIdAtBlockNumber(hydratedBlock[0].block)
18
- const validateHydratedBlockErrors = await validateHydratedBlock(context, hydratedBlock, context.chainIdAtBlockNumber)
19
- for (const validateHydratedBlockError of validateHydratedBlockErrors) {
20
- errors.push(new HydratedBlockStateValidationError(
21
- hydratedBlock[0]._hash,
22
- chainId,
23
- hydratedBlock,
24
- `validateBlock error: ${validateHydratedBlockError}`,
25
- validateHydratedBlockError,
26
- ))
27
- }
28
- const validators: HydratedBlockStateValidationFunction[] = [
29
- RequiredBalanceBlockStateValidator,
30
- ...additionalValidators,
31
- ]
32
- errors.push(...(await Promise.all(validators.map(v => v(context, hydratedBlock)))).flat())
33
- } catch (ex) {
34
- errors.push(new HydratedBlockStateValidationError(
35
- hydratedBlock?.[0]?._hash ?? ZERO_HASH,
36
- chainId ?? '00' as ChainId,
37
- hydratedBlock,
38
- `Failed validateHydratedBlockState: ${ex}`,
39
- ex,
40
- ))
41
- }
42
- return errors
43
- }, context)
44
- }
@@ -1,59 +0,0 @@
1
- import type { Address } from '@xylabs/sdk-js'
2
- import { spanRootAsync, ZERO_HASH } from '@xylabs/sdk-js'
3
- import type { ChainId, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-sdk'
4
- import {
5
- AttoXL1, HydratedBlockStateValidationError, netBalancesForPayloads, XYO_ZERO_ADDRESS,
6
- } from '@xyo-network/xl1-sdk'
7
-
8
- export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidationFunction = async (
9
- context,
10
- block,
11
- ) => {
12
- return await spanRootAsync('RequiredBalanceBlockStateValidator', async () => {
13
- const errors: HydratedBlockStateValidationError[] = []
14
- let chainId = '00' as ChainId
15
- try {
16
- // TODO: Filter by non-producer elevated payloads
17
- // to allow for transfers from ZERO address
18
- const netBalances = netBalancesForPayloads({ singletons: {} }, (block[1]))
19
- const netBalanceAddresses = Object.keys(netBalances) as Address[]
20
- const requiredBalances: Record<Address, bigint> = {}
21
- for (const address of netBalanceAddresses) {
22
- if (netBalances[address] < 0n) {
23
- requiredBalances[address] = -netBalances[address]
24
- }
25
- }
26
- const previous = block[0].previous
27
- if (previous === null) return [new HydratedBlockStateValidationError(
28
- block?.[0]?._hash ?? ZERO_HASH,
29
- '00' as ChainId,
30
- block,
31
- 'Insufficient funds because first block',
32
- )]
33
- chainId = await context.chainIdAtBlockNumber(block[0].block)
34
- await spanRootAsync('RequiredBalanceBlockStateValidator|balancesLoop', async () => {
35
- for (const [address, reqBalance] of Object.entries(requiredBalances) as [Address, bigint][]) {
36
- const result = await context.accountBalance.accountBalances([address], { head: previous })
37
- const balance = result[address] ?? AttoXL1(0n)
38
- if (address !== XYO_ZERO_ADDRESS && reqBalance > balance) {
39
- errors.push(new HydratedBlockStateValidationError(
40
- block?.[0]?._hash ?? ZERO_HASH,
41
- chainId,
42
- block,
43
- `insufficient balance for ${address} ${balance} < ${requiredBalances[address]}`,
44
- ))
45
- }
46
- }
47
- }, context)
48
- } catch (ex) {
49
- errors.push(new HydratedBlockStateValidationError(
50
- block?.[0]?._hash ?? ZERO_HASH,
51
- chainId,
52
- block,
53
- `Failed RequiredBalanceBlockStateValidator: ${ex}`,
54
- ex,
55
- ))
56
- }
57
- return await Promise.resolve(errors)
58
- }, context)
59
- }
@@ -1 +0,0 @@
1
- export * from './RequiredBalance.ts'
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './block/index.ts'
2
- export * from './hydratedBlock/index.ts'
3
- export * from './hydratedBlockState/index.ts'