@xyo-network/chain-validation 1.5.35 → 1.5.36
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 +193 -140
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/types/block/validateBlock.d.ts.map +1 -1
- package/dist/types/block/validators/AllowedPayloadSchemas.d.ts.map +1 -1
- package/dist/types/block/validators/Fields.d.ts.map +1 -1
- package/dist/types/block/validators/JsonSchema.d.ts.map +1 -1
- package/dist/types/block/validators/PreviousHash.d.ts.map +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessReferences.d.ts.map +1 -1
- package/dist/types/boundwitness/validators/BoundWitnessSignatures.d.ts.map +1 -1
- package/dist/types/elevatedPayload/lib/validateElevatedFromBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/lib/validateElevatedFromTransaction.d.ts.map +1 -1
- package/dist/types/elevatedPayload/lib/validateTransactionInBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/payloads/validateChainStakeIntentInBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/payloads/validateHashInBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/payloads/validateSchemaInBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/payloads/validateTransferInBlock.d.ts.map +1 -1
- package/dist/types/elevatedPayload/validatePayloadInBlock.d.ts.map +1 -1
- package/dist/types/hydratedBlock/validateHydratedBlock.d.ts.map +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 +1 -1
- package/dist/types/transaction/validateTransaction.d.ts.map +1 -1
- package/dist/types/transaction/validators/TransactionDurationValidator.d.ts.map +1 -1
- package/dist/types/transaction/validators/TransactionElevationValidator.d.ts.map +1 -1
- package/dist/types/transaction/validators/TransactionFromValidator.d.ts.map +1 -1
- package/dist/types/transaction/validators/TransactionGasValidator.d.ts.map +1 -1
- package/dist/types/transaction/validators/TransactionJsonSchemaValidator.d.ts.map +1 -1
- package/package.json +29 -27
- package/src/block/validateBlock.ts +7 -4
- package/src/block/validators/AllowedPayloadSchemas.ts +4 -3
- package/src/block/validators/Fields.ts +4 -3
- package/src/block/validators/JsonSchema.ts +23 -20
- package/src/block/validators/PreviousHash.ts +7 -5
- package/src/boundwitness/validators/BoundWitnessReferences.ts +5 -3
- package/src/boundwitness/validators/BoundWitnessSignatures.ts +6 -4
- package/src/elevatedPayload/lib/validateElevatedFromBlock.ts +12 -7
- package/src/elevatedPayload/lib/validateElevatedFromTransaction.ts +14 -8
- package/src/elevatedPayload/lib/validateIncludedInBlock.ts +2 -2
- package/src/elevatedPayload/lib/validateTransactionInBlock.ts +12 -8
- package/src/elevatedPayload/lib/validateTypedPayloadInBlock.ts +2 -2
- package/src/elevatedPayload/payloads/validateChainStakeIntentInBlock.ts +9 -5
- package/src/elevatedPayload/payloads/validateHashInBlock.ts +9 -5
- package/src/elevatedPayload/payloads/validateSchemaInBlock.ts +9 -5
- package/src/elevatedPayload/payloads/validateTransferInBlock.ts +9 -5
- package/src/elevatedPayload/validatePayloadInBlock.ts +8 -6
- package/src/hydratedBlock/validateHydratedBlock.ts +13 -6
- package/src/hydratedBlock/validators/Payloads.ts +13 -4
- package/src/hydratedBlockState/validateHydratedBlockState.ts +21 -10
- package/src/hydratedBlockState/validators/RequiredBalance.ts +15 -13
- package/src/transaction/validateTransaction.ts +2 -2
- package/src/transaction/validators/TransactionDurationValidator.ts +4 -3
- package/src/transaction/validators/TransactionElevationValidator.ts +4 -3
- package/src/transaction/validators/TransactionFromValidator.ts +4 -3
- package/src/transaction/validators/TransactionGasValidator.ts +4 -3
- package/src/transaction/validators/TransactionJsonSchemaValidator.ts +3 -5
- package/src/transaction/validators/TransactionProtocolValidator.ts +2 -2
|
@@ -1,32 +1,43 @@
|
|
|
1
1
|
import { type Address, ZERO_HASH } from '@xylabs/hex'
|
|
2
2
|
import type {
|
|
3
|
-
|
|
3
|
+
AccountBalanceServiceV2, HydratedBlock,
|
|
4
|
+
HydratedBlockStateValidationFunctionV2,
|
|
4
5
|
} from '@xyo-network/xl1-protocol'
|
|
5
6
|
import { HydratedBlockStateValidationError } from '@xyo-network/xl1-protocol'
|
|
6
7
|
|
|
7
8
|
import { validateHydratedBlock } from '../hydratedBlock/index.ts'
|
|
8
9
|
import { RequiredBalanceBlockStateValidator } from './validators/index.ts'
|
|
9
10
|
|
|
10
|
-
export const validateHydratedBlockState:
|
|
11
|
+
export const validateHydratedBlockState: HydratedBlockStateValidationFunctionV2 = async (
|
|
11
12
|
hydratedBlock: HydratedBlock,
|
|
12
13
|
chainId: Address,
|
|
13
|
-
services: { accountBalance:
|
|
14
|
-
additionalValidators:
|
|
15
|
-
)
|
|
16
|
-
const errors:
|
|
14
|
+
services: { accountBalance: AccountBalanceServiceV2 },
|
|
15
|
+
additionalValidators: HydratedBlockStateValidationFunctionV2[] = [],
|
|
16
|
+
) => {
|
|
17
|
+
const errors: HydratedBlockStateValidationError[] = []
|
|
17
18
|
try {
|
|
18
|
-
|
|
19
|
-
const
|
|
19
|
+
const validateHydratedBlockErrors = await validateHydratedBlock(hydratedBlock, chainId)
|
|
20
|
+
for (const validateHydratedBlockError of validateHydratedBlockErrors) {
|
|
21
|
+
errors.push(new HydratedBlockStateValidationError(
|
|
22
|
+
hydratedBlock[0]._hash,
|
|
23
|
+
chainId,
|
|
24
|
+
hydratedBlock,
|
|
25
|
+
`validateBlock error: ${validateHydratedBlockError}`,
|
|
26
|
+
validateHydratedBlockError,
|
|
27
|
+
))
|
|
28
|
+
}
|
|
29
|
+
const validators: HydratedBlockStateValidationFunctionV2[] = [
|
|
20
30
|
RequiredBalanceBlockStateValidator,
|
|
21
31
|
...additionalValidators,
|
|
22
32
|
]
|
|
23
33
|
errors.push(...(await Promise.all(validators.map(v => v(hydratedBlock, chainId, services)))).flat())
|
|
24
|
-
} catch (
|
|
34
|
+
} catch (ex) {
|
|
25
35
|
errors.push(new HydratedBlockStateValidationError(
|
|
26
36
|
hydratedBlock?.[0]?._hash ?? ZERO_HASH,
|
|
27
37
|
chainId,
|
|
28
38
|
hydratedBlock,
|
|
29
|
-
`Failed validateHydratedBlockState: ${
|
|
39
|
+
`Failed validateHydratedBlockState: ${ex}`,
|
|
40
|
+
ex,
|
|
30
41
|
))
|
|
31
42
|
}
|
|
32
43
|
return errors
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type Address, hexToBigInt, ZERO_HASH,
|
|
3
|
-
} from '@xylabs/hex'
|
|
4
|
-
import { netBalancesForPayloads } from '@xyo-network/chain-protocol'
|
|
1
|
+
import { type Address, ZERO_HASH } from '@xylabs/hex'
|
|
5
2
|
import { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'
|
|
6
3
|
import type {
|
|
7
|
-
|
|
4
|
+
AccountBalanceServiceV2, HydratedBlock,
|
|
5
|
+
HydratedBlockStateValidationFunctionV2,
|
|
8
6
|
} from '@xyo-network/xl1-protocol'
|
|
9
|
-
import { HydratedBlockStateValidationError } from '@xyo-network/xl1-protocol'
|
|
7
|
+
import { AttoXL1, HydratedBlockStateValidationError } from '@xyo-network/xl1-protocol'
|
|
8
|
+
import { netBalancesForPayloads } from '@xyo-network/xl1-protocol-sdk'
|
|
10
9
|
|
|
11
|
-
export const RequiredBalanceBlockStateValidator:
|
|
10
|
+
export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidationFunctionV2 = async (
|
|
12
11
|
block: HydratedBlock,
|
|
13
12
|
chainId: Address,
|
|
14
|
-
services: { accountBalance:
|
|
13
|
+
services: { accountBalance: AccountBalanceServiceV2 },
|
|
15
14
|
) => {
|
|
16
|
-
const errors:
|
|
15
|
+
const errors: HydratedBlockStateValidationError[] = []
|
|
17
16
|
try {
|
|
18
17
|
// TODO: Filter by non-producer elevated payloads
|
|
19
18
|
// to allow for transfers from ZERO address
|
|
@@ -34,7 +33,8 @@ export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidationFun
|
|
|
34
33
|
)]
|
|
35
34
|
|
|
36
35
|
for (const [address, reqBalance] of Object.entries(requiredBalances) as [Address, bigint][]) {
|
|
37
|
-
const
|
|
36
|
+
const result = await services.accountBalance.balances(previous, [address])
|
|
37
|
+
const balance = result[address] ?? AttoXL1(0n)
|
|
38
38
|
if (address !== XYO_ZERO_ADDRESS && reqBalance > balance) {
|
|
39
39
|
errors.push(new HydratedBlockStateValidationError(
|
|
40
40
|
block?.[0]?._hash ?? ZERO_HASH,
|
|
@@ -44,13 +44,15 @@ export const RequiredBalanceBlockStateValidator: HydratedBlockStateValidationFun
|
|
|
44
44
|
))
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
}
|
|
47
|
+
} /*
|
|
48
|
+
catch (ex) {
|
|
48
49
|
errors.push(new HydratedBlockStateValidationError(
|
|
49
50
|
block?.[0]?._hash ?? ZERO_HASH,
|
|
50
51
|
chainId,
|
|
51
52
|
block,
|
|
52
|
-
`Failed RequiredBalanceBlockStateValidator: ${
|
|
53
|
+
`Failed RequiredBalanceBlockStateValidator: ${ex}`,
|
|
54
|
+
ex,
|
|
53
55
|
))
|
|
54
|
-
}
|
|
56
|
+
} */ finally {}
|
|
55
57
|
return await Promise.resolve(errors)
|
|
56
58
|
}
|
|
@@ -27,7 +27,7 @@ export async function validateTransaction(
|
|
|
27
27
|
...additionalValidators,
|
|
28
28
|
]
|
|
29
29
|
return (await Promise.all(validators.map(v => v(tx, chainId)))).flat()
|
|
30
|
-
} catch (
|
|
31
|
-
return [(new Error(`Failed TransactionGasValidator: ${
|
|
30
|
+
} catch (ex) {
|
|
31
|
+
return [(new Error(`Failed TransactionGasValidator: ${ex}`))]
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -8,7 +8,7 @@ import { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'
|
|
|
8
8
|
export const TransactionDurationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (
|
|
9
9
|
tx: HydratedTransaction,
|
|
10
10
|
) => {
|
|
11
|
-
const errors:
|
|
11
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
12
12
|
try {
|
|
13
13
|
const { exp, nbf } = tx[0]
|
|
14
14
|
if (nbf < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction nbf must be positive'))
|
|
@@ -20,11 +20,12 @@ export const TransactionDurationValidator: HydratedTransactionValidationFunction
|
|
|
20
20
|
tx,
|
|
21
21
|
'Transaction exp must not be too far in the future',
|
|
22
22
|
))
|
|
23
|
-
} catch (
|
|
23
|
+
} catch (ex) {
|
|
24
24
|
errors.push(new HydratedTransactionValidationError(
|
|
25
25
|
tx?.[0]?._hash ?? ZERO_HASH,
|
|
26
26
|
tx,
|
|
27
|
-
`Failed TransactionDurationValidator: ${
|
|
27
|
+
`Failed TransactionDurationValidator: ${ex}`,
|
|
28
|
+
ex,
|
|
28
29
|
))
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -8,18 +8,19 @@ import { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'
|
|
|
8
8
|
export const TransactionElevationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (
|
|
9
9
|
tx: HydratedTransaction,
|
|
10
10
|
) => {
|
|
11
|
-
const errors:
|
|
11
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
12
12
|
try {
|
|
13
13
|
try {
|
|
14
14
|
extractElevatedHashes(tx)
|
|
15
15
|
} catch {
|
|
16
16
|
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Hydrated transaction does not include all script hashes'))
|
|
17
17
|
}
|
|
18
|
-
} catch (
|
|
18
|
+
} catch (ex) {
|
|
19
19
|
errors.push(new HydratedTransactionValidationError(
|
|
20
20
|
tx?.[0]?._hash ?? ZERO_HASH,
|
|
21
21
|
tx,
|
|
22
|
-
`Failed TransactionElevationValidator: ${
|
|
22
|
+
`Failed TransactionElevationValidator: ${ex}`,
|
|
23
|
+
ex,
|
|
23
24
|
))
|
|
24
25
|
}
|
|
25
26
|
return errors
|
|
@@ -8,7 +8,7 @@ import { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'
|
|
|
8
8
|
export const TransactionFromValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (
|
|
9
9
|
tx: HydratedTransaction,
|
|
10
10
|
) => {
|
|
11
|
-
const errors:
|
|
11
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
12
12
|
try {
|
|
13
13
|
const from = asAddress(tx[0].from)
|
|
14
14
|
if (from === undefined)errors.push(new HydratedTransactionValidationError(
|
|
@@ -21,11 +21,12 @@ export const TransactionFromValidator: HydratedTransactionValidationFunction<Tra
|
|
|
21
21
|
tx,
|
|
22
22
|
'Transaction from address must be listed in addresses',
|
|
23
23
|
))
|
|
24
|
-
} catch (
|
|
24
|
+
} catch (ex) {
|
|
25
25
|
errors.push(new HydratedTransactionValidationError(
|
|
26
26
|
tx?.[0]?._hash ?? ZERO_HASH,
|
|
27
27
|
tx,
|
|
28
|
-
`Failed TransactionFromValidator: ${
|
|
28
|
+
`Failed TransactionFromValidator: ${ex}`,
|
|
29
|
+
ex,
|
|
29
30
|
))
|
|
30
31
|
}
|
|
31
32
|
return errors
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
export const TransactionGasValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (
|
|
15
15
|
tx: HydratedTransaction,
|
|
16
16
|
) => {
|
|
17
|
-
const errors:
|
|
17
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
18
18
|
try {
|
|
19
19
|
if (tx?.[0].fees === undefined) {
|
|
20
20
|
errors.push(new HydratedTransactionValidationError(
|
|
@@ -73,11 +73,12 @@ export const TransactionGasValidator: HydratedTransactionValidationFunction<Tran
|
|
|
73
73
|
`fees.priority must be >= ${minTransactionFees.priority}`,
|
|
74
74
|
))
|
|
75
75
|
}
|
|
76
|
-
} catch (
|
|
76
|
+
} catch (ex) {
|
|
77
77
|
errors.push(new HydratedTransactionValidationError(
|
|
78
78
|
tx?.[0]?._hash ?? ZERO_HASH,
|
|
79
79
|
tx,
|
|
80
|
-
`Failed TransactionGasValidator: ${
|
|
80
|
+
`Failed TransactionGasValidator: ${ex}`,
|
|
81
|
+
ex,
|
|
81
82
|
))
|
|
82
83
|
}
|
|
83
84
|
return errors
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { ZERO_HASH } from '@xylabs/hex'
|
|
2
|
-
import { toJsonString } from '@xylabs/object'
|
|
3
2
|
import { TransactionBoundWitnessJsonSchema } from '@xyo-network/chain-schema'
|
|
4
3
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
5
4
|
import type {
|
|
@@ -16,21 +15,20 @@ let validate: ValidateFunction<TransactionBoundWitness> | undefined
|
|
|
16
15
|
export const TransactionJsonSchemaValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (
|
|
17
16
|
tx: HydratedTransaction,
|
|
18
17
|
) => {
|
|
19
|
-
const errors:
|
|
18
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
20
19
|
try {
|
|
21
20
|
if (validate === undefined) validate = ajv.compile(TransactionBoundWitnessJsonSchema)
|
|
22
|
-
// see if you can export the super set
|
|
23
21
|
if (!validate(PayloadBuilder.omitStorageMeta(tx[0]))) {
|
|
24
22
|
const error = new HydratedTransactionValidationError(
|
|
25
23
|
tx?.[0]?._hash ?? ZERO_HASH,
|
|
26
24
|
tx,
|
|
27
|
-
`failed JSON schema validation: ${
|
|
25
|
+
`failed JSON schema validation: ${ajv.errorsText(validate.errors, { separator: '\n' })}`,
|
|
28
26
|
)
|
|
29
27
|
error.cause = validate.errors
|
|
30
28
|
errors.push(error)
|
|
31
29
|
}
|
|
32
30
|
} catch (ex) {
|
|
33
|
-
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted'
|
|
31
|
+
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))
|
|
34
32
|
}
|
|
35
33
|
return errors
|
|
36
34
|
}
|
|
@@ -8,13 +8,13 @@ export const TransactionProtocolValidator: HydratedTransactionValidationFunction
|
|
|
8
8
|
tx: HydratedTransaction,
|
|
9
9
|
chainId?: Address,
|
|
10
10
|
) => {
|
|
11
|
-
const errors:
|
|
11
|
+
const errors: HydratedTransactionValidationError[] = []
|
|
12
12
|
try {
|
|
13
13
|
if (chainId !== undefined && tx[0].chain !== chainId) {
|
|
14
14
|
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'invalid chain id'))
|
|
15
15
|
}
|
|
16
16
|
} catch (ex) {
|
|
17
|
-
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted'
|
|
17
|
+
errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))
|
|
18
18
|
}
|
|
19
19
|
return await Promise.resolve(errors)
|
|
20
20
|
}
|