@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.
- package/README.md +9 -200
- package/package.json +116 -24
- package/src/block/index.ts +0 -2
- package/src/block/validateBlock.ts +0 -39
- package/src/block/validators/AllowedPayloadSchemas.ts +0 -33
- package/src/block/validators/Fields.ts +0 -47
- package/src/block/validators/JsonSchema.ts +0 -40
- package/src/block/validators/PreviousHash.ts +0 -37
- package/src/block/validators/index.ts +0 -4
- package/src/elevatedPayload/index.ts +0 -1
- package/src/elevatedPayload/lib/index.ts +0 -6
- package/src/elevatedPayload/lib/isElevatedFromBlock.ts +0 -12
- package/src/elevatedPayload/lib/validateElevatedFromBlock.ts +0 -25
- package/src/elevatedPayload/lib/validateElevatedFromTransaction.ts +0 -30
- package/src/elevatedPayload/lib/validateIncludedInBlock.ts +0 -14
- package/src/elevatedPayload/lib/validateTransactionInBlock.ts +0 -43
- package/src/elevatedPayload/lib/validateTypedPayloadInBlock.ts +0 -32
- package/src/elevatedPayload/payloads/index.ts +0 -8
- package/src/elevatedPayload/payloads/validateBridgeDestinationObservationInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateBridgeIntentInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateBridgeSourceObservationInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateChainStakeIntentInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateHashInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateSchemaInBlock.ts +0 -29
- package/src/elevatedPayload/payloads/validateTimeInBlock.ts +0 -28
- package/src/elevatedPayload/payloads/validateTransferInBlock.ts +0 -28
- package/src/elevatedPayload/validatePayloadInBlock.ts +0 -53
- package/src/hydratedBlock/index.ts +0 -2
- package/src/hydratedBlock/validateHydratedBlock.ts +0 -49
- package/src/hydratedBlock/validators/Payloads.ts +0 -54
- package/src/hydratedBlock/validators/index.ts +0 -1
- package/src/hydratedBlockState/index.ts +0 -2
- package/src/hydratedBlockState/validateHydratedBlockState.ts +0 -44
- package/src/hydratedBlockState/validators/RequiredBalance.ts +0 -59
- package/src/hydratedBlockState/validators/index.ts +0 -1
- 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,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,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