@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.
- package/dist/neutral/index.mjs +116 -105
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/types/block/index.d.ts +0 -1
- package/dist/types/block/index.d.ts.map +1 -1
- package/dist/types/block/validateBlock.d.ts +1 -1
- package/dist/types/block/validateBlock.d.ts.map +1 -1
- package/dist/types/block/validators/AllowedPayloadSchemas.d.ts +1 -1
- package/dist/types/block/validators/AllowedPayloadSchemas.d.ts.map +1 -1
- package/dist/types/block/validators/Fields.d.ts +1 -1
- package/dist/types/block/validators/Fields.d.ts.map +1 -1
- package/dist/types/block/validators/JsonSchema.d.ts +1 -1
- package/dist/types/block/validators/JsonSchema.d.ts.map +1 -1
- package/dist/types/block/validators/PreviousHash.d.ts +1 -1
- package/dist/types/block/validators/PreviousHash.d.ts.map +1 -1
- package/dist/types/boundwitness/index.d.ts +0 -2
- package/dist/types/boundwitness/index.d.ts.map +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessReferences.d.ts +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessReferences.d.ts.map +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessSignatures.d.ts +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessSignatures.d.ts.map +1 -1
- package/dist/types/elevatedPayload/index.d.ts +1 -7
- package/dist/types/elevatedPayload/index.d.ts.map +1 -1
- package/dist/types/elevatedPayload/lib/index.d.ts +7 -0
- package/dist/types/elevatedPayload/lib/index.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/isElevatedFromBlock.d.ts +4 -0
- package/dist/types/elevatedPayload/lib/isElevatedFromBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/validateElevatedFromBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/lib/validateElevatedFromBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/validateElevatedFromTransaction.d.ts +3 -0
- package/dist/types/elevatedPayload/lib/validateElevatedFromTransaction.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/validateIncludedInBlock.d.ts +4 -0
- package/dist/types/elevatedPayload/lib/validateIncludedInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/validateTransactionInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/lib/validateTransactionInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/lib/validateTypedPayloadInBlock.d.ts +5 -0
- package/dist/types/elevatedPayload/lib/validateTypedPayloadInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/payloads/index.d.ts +5 -0
- package/dist/types/elevatedPayload/payloads/index.d.ts.map +1 -0
- package/dist/types/elevatedPayload/payloads/validateChainStakeIntentInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/payloads/validateChainStakeIntentInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/payloads/validateHashInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/payloads/validateHashInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/payloads/validateSchemaInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/payloads/validateSchemaInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/payloads/validateTransferInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/payloads/validateTransferInBlock.d.ts.map +1 -0
- package/dist/types/elevatedPayload/validatePayloadInBlock.d.ts +3 -0
- package/dist/types/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -0
- package/dist/types/hydratedBlock/index.d.ts +0 -1
- package/dist/types/hydratedBlock/index.d.ts.map +1 -1
- package/dist/types/hydratedBlock/validateHydratedBlock.d.ts +1 -1
- package/dist/types/hydratedBlock/validateHydratedBlock.d.ts.map +1 -1
- package/dist/types/hydratedBlock/validators/Payloads.d.ts +1 -1
- package/dist/types/hydratedBlock/validators/Payloads.d.ts.map +1 -1
- package/dist/types/hydratedBlockState/validateHydratedBlockState.d.ts +2 -2
- package/dist/types/hydratedBlockState/validateHydratedBlockState.d.ts.map +1 -1
- package/dist/types/hydratedBlockState/validators/RequiredBalance.d.ts +2 -2
- package/dist/types/hydratedBlockState/validators/RequiredBalance.d.ts.map +1 -1
- package/dist/types/transaction/validateTransaction.d.ts +3 -2
- package/dist/types/transaction/validateTransaction.d.ts.map +1 -1
- package/dist/types/transaction/validators/{TransactionElevation.d.ts → TransactionElevationValidator.d.ts} +1 -1
- package/dist/types/transaction/validators/TransactionElevationValidator.d.ts.map +1 -0
- package/dist/types/transaction/validators/TransactionFromValidator.d.ts +3 -0
- package/dist/types/transaction/validators/TransactionFromValidator.d.ts.map +1 -0
- package/dist/types/transaction/validators/{TransactionJsonSchema.d.ts → TransactionJsonSchemaValidator.d.ts} +1 -1
- package/dist/types/transaction/validators/TransactionJsonSchemaValidator.d.ts.map +1 -0
- package/dist/types/transaction/validators/{TransactionProtocol.d.ts → TransactionProtocolValidator.d.ts} +1 -1
- package/dist/types/transaction/validators/TransactionProtocolValidator.d.ts.map +1 -0
- package/dist/types/transaction/validators/index.d.ts +4 -3
- package/dist/types/transaction/validators/index.d.ts.map +1 -1
- package/package.json +16 -17
- package/src/block/index.ts +0 -1
- package/src/block/validateBlock.ts +1 -2
- package/src/block/validators/AllowedPayloadSchemas.ts +3 -4
- package/src/block/validators/Fields.ts +1 -3
- package/src/block/validators/JsonSchema.ts +1 -3
- package/src/block/validators/PreviousHash.ts +1 -3
- package/src/boundwitness/index.ts +0 -2
- package/src/boundwitness/validators/BoundWitnessReferences.ts +1 -2
- package/src/boundwitness/validators/BoundWitnessSignatures.ts +1 -2
- package/src/elevatedPayload/index.ts +1 -7
- package/src/elevatedPayload/lib/index.ts +6 -0
- package/src/elevatedPayload/lib/isElevatedFromBlock.ts +12 -0
- package/src/elevatedPayload/{validateElevatedInBlock.ts → lib/validateElevatedFromBlock.ts} +2 -4
- package/src/elevatedPayload/lib/validateElevatedFromTransaction.ts +20 -0
- package/src/elevatedPayload/lib/validateIncludedInBlock.ts +10 -0
- package/src/elevatedPayload/lib/validateTransactionInBlock.ts +18 -0
- package/src/elevatedPayload/lib/validateTypedPayloadInBlock.ts +27 -0
- package/src/elevatedPayload/payloads/index.ts +4 -0
- package/src/elevatedPayload/payloads/validateChainStakeIntentInBlock.ts +13 -0
- package/src/elevatedPayload/payloads/validateHashInBlock.ts +13 -0
- package/src/elevatedPayload/payloads/validateSchemaInBlock.ts +13 -0
- package/src/elevatedPayload/payloads/validateTransferInBlock.ts +14 -0
- package/src/elevatedPayload/validatePayloadInBlock.ts +37 -0
- package/src/hydratedBlock/index.ts +0 -1
- package/src/hydratedBlock/validateHydratedBlock.ts +6 -3
- package/src/hydratedBlock/validators/Payloads.ts +9 -36
- package/src/hydratedBlockState/validateHydratedBlockState.ts +4 -4
- package/src/hydratedBlockState/validators/RequiredBalance.ts +2 -2
- package/src/transaction/validateTransaction.ts +8 -9
- package/src/transaction/validators/TransactionElevationValidator.ts +12 -0
- package/src/transaction/validators/TransactionFromValidator.ts +16 -0
- package/src/transaction/validators/{TransactionJsonSchema.ts → TransactionJsonSchemaValidator.ts} +2 -1
- package/src/transaction/validators/{TransactionProtocol.ts → TransactionProtocolValidator.ts} +4 -6
- package/src/transaction/validators/index.ts +4 -3
- package/babel.config.json +0 -6
- package/dist/types/block/BlockValidationFunction.d.ts +0 -5
- package/dist/types/block/BlockValidationFunction.d.ts.map +0 -1
- package/dist/types/boundwitness/BoundWitnessValidationFunction.d.ts +0 -4
- package/dist/types/boundwitness/BoundWitnessValidationFunction.d.ts.map +0 -1
- package/dist/types/boundwitness/HydratedBoundWitnessValidationFunction.d.ts +0 -5
- package/dist/types/boundwitness/HydratedBoundWitnessValidationFunction.d.ts.map +0 -1
- package/dist/types/elevatedPayload/InBlockPayloadValidationFunction.d.ts +0 -6
- package/dist/types/elevatedPayload/InBlockPayloadValidationFunction.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateChainStakeIntentInBlock.d.ts +0 -3
- package/dist/types/elevatedPayload/validateChainStakeIntentInBlock.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateElevatedInBlock.d.ts +0 -3
- package/dist/types/elevatedPayload/validateElevatedInBlock.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateElevatedInTransaction.d.ts +0 -3
- package/dist/types/elevatedPayload/validateElevatedInTransaction.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateSchemaInBlock.d.ts +0 -3
- package/dist/types/elevatedPayload/validateSchemaInBlock.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateTransactionInBlock.d.ts +0 -3
- package/dist/types/elevatedPayload/validateTransactionInBlock.d.ts.map +0 -1
- package/dist/types/elevatedPayload/validateTransferInBlock.d.ts +0 -3
- package/dist/types/elevatedPayload/validateTransferInBlock.d.ts.map +0 -1
- package/dist/types/hydratedBlock/HydratedBlockValidationFunction.d.ts +0 -5
- package/dist/types/hydratedBlock/HydratedBlockValidationFunction.d.ts.map +0 -1
- package/dist/types/transaction/validators/TransactionElevation.d.ts.map +0 -1
- package/dist/types/transaction/validators/TransactionJsonSchema.d.ts.map +0 -1
- package/dist/types/transaction/validators/TransactionProtocol.d.ts.map +0 -1
- package/src/block/BlockValidationFunction.ts +0 -8
- package/src/boundwitness/BoundWitnessValidationFunction.ts +0 -6
- package/src/boundwitness/HydratedBoundWitnessValidationFunction.ts +0 -7
- package/src/elevatedPayload/InBlockPayloadValidationFunction.ts +0 -8
- package/src/elevatedPayload/validateChainStakeIntentInBlock.ts +0 -29
- package/src/elevatedPayload/validateElevatedInTransaction.ts +0 -23
- package/src/elevatedPayload/validateSchemaInBlock.ts +0 -24
- package/src/elevatedPayload/validateTransactionInBlock.ts +0 -18
- package/src/elevatedPayload/validateTransferInBlock.ts +0 -24
- package/src/hydratedBlock/HydratedBlockValidationFunction.ts +0 -8
- 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,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,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[] = [
|
|
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 {
|
|
2
|
-
import {
|
|
1
|
+
import type { Hash } from '@xylabs/hex'
|
|
2
|
+
import type { Payload, WithHashStorageMeta } from '@xyo-network/payload-model'
|
|
3
3
|
import type {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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,
|
|
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:
|
|
8
|
+
export const validateHydratedBlockState: HydratedBlockStateValidationFunction = async (
|
|
9
9
|
hydratedBlock: HydratedBlock,
|
|
10
10
|
chainId: Address,
|
|
11
11
|
archivist: ReadArchivist,
|
|
12
|
-
additionalValidators:
|
|
12
|
+
additionalValidators: HydratedBlockStateValidationFunction[] = [],
|
|
13
13
|
): Promise<Error[]> => {
|
|
14
14
|
const errors: Error[] = await validateHydratedBlock(hydratedBlock, chainId)
|
|
15
|
-
const validators:
|
|
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,
|
|
7
|
+
import type { HydratedBlock, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-model'
|
|
8
8
|
|
|
9
|
-
export const RequiredBalanceBlockStateValidator:
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
+
}
|
package/src/transaction/validators/{TransactionJsonSchema.ts → TransactionJsonSchemaValidator.ts}
RENAMED
|
@@ -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)
|
package/src/transaction/validators/{TransactionProtocol.ts → TransactionProtocolValidator.ts}
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 (
|
|
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 './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
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,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 +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 +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 +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 +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 +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 +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,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
|
-
}
|