@xyo-network/xl1-protocol 4.4.2 → 4.4.4
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/modules/protocol-model/TransferPayload.d.ts +43 -1
- package/dist/neutral/modules/protocol-model/TransferPayload.d.ts.map +1 -1
- package/dist/neutral/modules/protocol-model/block/AllowedBlockPayload.d.ts.map +1 -1
- package/dist/neutral/modules/protocol-model/payload/elevatable/Time.d.ts +3 -1
- package/dist/neutral/modules/protocol-model/payload/elevatable/Time.d.ts.map +1 -1
- package/dist/neutral/modules/validation/block/validators/BlockCumulativeBalanceValidator.d.ts +7 -0
- package/dist/neutral/modules/validation/block/validators/BlockCumulativeBalanceValidator.d.ts.map +1 -1
- package/dist/neutral/modules/validation/transaction/validateTransaction.d.ts +9 -1
- package/dist/neutral/modules/validation/transaction/validateTransaction.d.ts.map +1 -1
- package/dist/neutral/modules/validation/transaction/validators/TransactionTransfersValidator.d.ts +7 -1
- package/dist/neutral/modules/validation/transaction/validators/TransactionTransfersValidator.d.ts.map +1 -1
- package/dist/neutral/protocol-lib.mjs +4 -4
- package/dist/neutral/protocol-lib.mjs.map +2 -2
- package/dist/neutral/protocol-model.mjs +60 -53
- package/dist/neutral/protocol-model.mjs.map +3 -3
- package/dist/neutral/validation.mjs +92 -65
- package/dist/neutral/validation.mjs.map +3 -3
- package/package.json +1 -1
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
// src/modules/validation/block/validators/BlockCumulativeBalanceValidator.ts
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
hexToBigInt,
|
|
4
|
+
ZERO_HASH
|
|
5
|
+
} from "@ariestools/sdk";
|
|
3
6
|
import {
|
|
4
7
|
HydratedBlockStateValidationError,
|
|
5
8
|
isTransactionBoundWitnessWithHashMeta,
|
|
6
|
-
|
|
9
|
+
isTransferPayload,
|
|
10
|
+
TransferSchema,
|
|
7
11
|
XYO_ZERO_ADDRESS
|
|
8
12
|
} from "#protocol-lib";
|
|
9
13
|
function maxTransactionFeeCost(tx) {
|
|
@@ -15,7 +19,7 @@ function maxTransactionFeeCost(tx) {
|
|
|
15
19
|
return hexToBigInt(base) + hexToBigInt(priority) + hexToBigInt(gasLimit);
|
|
16
20
|
}
|
|
17
21
|
function accumulateTransferOutflows(payload, txPayloadHashes, outflows) {
|
|
18
|
-
if (!txPayloadHashes.has(payload._hash) || !
|
|
22
|
+
if (!txPayloadHashes.has(payload._hash) || !isTransferPayload(payload)) return;
|
|
19
23
|
const { from } = payload;
|
|
20
24
|
for (const [to, amount] of Object.entries(payload.transfers)) {
|
|
21
25
|
if (to !== from) {
|
|
@@ -36,36 +40,58 @@ function accumulateOutflows(transactions, payloads) {
|
|
|
36
40
|
}
|
|
37
41
|
return outflows;
|
|
38
42
|
}
|
|
43
|
+
function findMalformedTransfers(transactions, payloads) {
|
|
44
|
+
const referenced = new Set(transactions.flatMap((tx) => tx.payload_hashes));
|
|
45
|
+
return payloads.filter((payload) => referenced.has(payload._hash) && payload.schema === TransferSchema && !isTransferPayload(payload));
|
|
46
|
+
}
|
|
39
47
|
function BlockCumulativeBalanceValidatorFactory() {
|
|
40
48
|
return async (context, hydratedBlock) => {
|
|
41
49
|
const [blockBw, payloads] = hydratedBlock;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const chainId = await context.chainIdAtBlockNumber(blockBw.block);
|
|
49
|
-
const errors = [];
|
|
50
|
-
for (const address of addresses) {
|
|
51
|
-
if (address === XYO_ZERO_ADDRESS) continue;
|
|
52
|
-
const balance = balances[address] ?? 0n;
|
|
53
|
-
const totalOutflow = outflows[address];
|
|
54
|
-
if (totalOutflow > balance) {
|
|
50
|
+
try {
|
|
51
|
+
const transactions = payloads.filter(isTransactionBoundWitnessWithHashMeta);
|
|
52
|
+
if (transactions.length === 0) return [];
|
|
53
|
+
const chainId = await context.chainIdAtBlockNumber(blockBw.block);
|
|
54
|
+
const errors = [];
|
|
55
|
+
for (const malformed of findMalformedTransfers(transactions, payloads)) {
|
|
55
56
|
errors.push(new HydratedBlockStateValidationError(
|
|
56
57
|
blockBw._hash,
|
|
57
58
|
chainId,
|
|
58
59
|
hydratedBlock,
|
|
59
|
-
`
|
|
60
|
+
`Transaction-referenced payload ${malformed._hash} claims the Transfer schema but is not a valid Transfer`
|
|
60
61
|
));
|
|
61
62
|
}
|
|
63
|
+
const outflows = accumulateOutflows(transactions, payloads);
|
|
64
|
+
const addresses = Object.keys(outflows);
|
|
65
|
+
if (addresses.length === 0) return errors;
|
|
66
|
+
const balances = await context.accountBalance.accountBalances(addresses);
|
|
67
|
+
for (const address of addresses) {
|
|
68
|
+
if (address === XYO_ZERO_ADDRESS) continue;
|
|
69
|
+
const balance = balances[address] ?? 0n;
|
|
70
|
+
const totalOutflow = outflows[address];
|
|
71
|
+
if (totalOutflow > balance) {
|
|
72
|
+
errors.push(new HydratedBlockStateValidationError(
|
|
73
|
+
blockBw._hash,
|
|
74
|
+
chainId,
|
|
75
|
+
hydratedBlock,
|
|
76
|
+
`Cumulative outflow for address ${address} exceeds available balance: outflow ${totalOutflow} > balance ${balance}`
|
|
77
|
+
));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return errors;
|
|
81
|
+
} catch (ex) {
|
|
82
|
+
return [new HydratedBlockStateValidationError(
|
|
83
|
+
blockBw?._hash ?? ZERO_HASH,
|
|
84
|
+
blockBw?.chain,
|
|
85
|
+
hydratedBlock,
|
|
86
|
+
`BlockCumulativeBalanceValidator excepted: ${ex.message}`,
|
|
87
|
+
ex
|
|
88
|
+
)];
|
|
62
89
|
}
|
|
63
|
-
return errors;
|
|
64
90
|
};
|
|
65
91
|
}
|
|
66
92
|
|
|
67
93
|
// src/modules/validation/boundwitness/validators/BoundWitnessReferences.ts
|
|
68
|
-
import { ZERO_HASH } from "@ariestools/sdk";
|
|
94
|
+
import { ZERO_HASH as ZERO_HASH2 } from "@ariestools/sdk";
|
|
69
95
|
import { isAnyPayload } from "@xyo-network/sdk";
|
|
70
96
|
import { HydratedBoundWitnessValidationError } from "#protocol-lib";
|
|
71
97
|
function getPayloadsFromPayloadArray(payloads, hashes) {
|
|
@@ -76,7 +102,7 @@ var BoundWitnessReferencesValidator = (allowedSchemas) => ([bw, payloadSet]) =>
|
|
|
76
102
|
try {
|
|
77
103
|
const payloads = getPayloadsFromPayloadArray(payloadSet, bw.payload_hashes);
|
|
78
104
|
if (payloads.length !== bw.payload_hashes.length) {
|
|
79
|
-
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
105
|
+
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], "unable to locate payloads"));
|
|
80
106
|
}
|
|
81
107
|
for (const payload of payloads) {
|
|
82
108
|
if (isAnyPayload(payload)) {
|
|
@@ -84,28 +110,28 @@ var BoundWitnessReferencesValidator = (allowedSchemas) => ([bw, payloadSet]) =>
|
|
|
84
110
|
const payloadDataHashIndex = bw.payload_hashes.indexOf(payload._dataHash);
|
|
85
111
|
const payloadIndex = Math.max(payloadHashIndex, payloadDataHashIndex);
|
|
86
112
|
if (payloadIndex === -1) {
|
|
87
|
-
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
113
|
+
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], "payload hash not found"));
|
|
88
114
|
}
|
|
89
115
|
const declaredSchema = bw.payload_schemas[payloadIndex];
|
|
90
116
|
if (declaredSchema !== payload.schema) {
|
|
91
|
-
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
117
|
+
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], "mismatched schema"));
|
|
92
118
|
}
|
|
93
119
|
if (allowedSchemas && !allowedSchemas.includes(payload.schema)) {
|
|
94
|
-
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
120
|
+
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], `disallowed schema [${payload.schema}]`));
|
|
95
121
|
}
|
|
96
122
|
} else {
|
|
97
|
-
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
123
|
+
errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], "invalid payload"));
|
|
98
124
|
}
|
|
99
125
|
}
|
|
100
126
|
} catch (ex) {
|
|
101
|
-
const error2 = new HydratedBoundWitnessValidationError(bw?._hash ??
|
|
127
|
+
const error2 = new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, [bw, payloadSet], `validation excepted: ${String(ex)}`, ex);
|
|
102
128
|
errors.push(error2);
|
|
103
129
|
}
|
|
104
130
|
return errors;
|
|
105
131
|
};
|
|
106
132
|
|
|
107
133
|
// src/modules/validation/boundwitness/validators/BoundWitnessSignatures.ts
|
|
108
|
-
import { toArrayBuffer, ZERO_HASH as
|
|
134
|
+
import { toArrayBuffer, ZERO_HASH as ZERO_HASH3 } from "@ariestools/sdk";
|
|
109
135
|
import { BoundWitnessBuilder, BoundWitnessValidator } from "@xyo-network/sdk";
|
|
110
136
|
import { BoundWitnessValidationError } from "#protocol-lib";
|
|
111
137
|
var BoundWitnessSignaturesValidator = async (bw) => {
|
|
@@ -121,17 +147,17 @@ var BoundWitnessSignaturesValidator = async (bw) => {
|
|
|
121
147
|
}));
|
|
122
148
|
for (const [, bwErrors] of results) {
|
|
123
149
|
for (const bwError of bwErrors) {
|
|
124
|
-
errors.push(new BoundWitnessValidationError(bw?._hash ??
|
|
150
|
+
errors.push(new BoundWitnessValidationError(bw?._hash ?? ZERO_HASH3, bw, "validation errors", bwError));
|
|
125
151
|
}
|
|
126
152
|
}
|
|
127
153
|
} catch (ex) {
|
|
128
|
-
errors.push(new BoundWitnessValidationError(bw?._hash ??
|
|
154
|
+
errors.push(new BoundWitnessValidationError(bw?._hash ?? ZERO_HASH3, bw, "validation excepted", ex));
|
|
129
155
|
}
|
|
130
156
|
return errors;
|
|
131
157
|
};
|
|
132
158
|
|
|
133
159
|
// src/modules/validation/transaction/validateTransaction.ts
|
|
134
|
-
import { ZERO_HASH as
|
|
160
|
+
import { ZERO_HASH as ZERO_HASH11 } from "@ariestools/sdk";
|
|
135
161
|
import { asHashMeta } from "@xyo-network/sdk";
|
|
136
162
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError9, isTransactionBoundWitness } from "#protocol-lib";
|
|
137
163
|
|
|
@@ -145,7 +171,7 @@ import {
|
|
|
145
171
|
derivedReceiveAddress,
|
|
146
172
|
elevatedPayloads,
|
|
147
173
|
HydratedTransactionValidationError,
|
|
148
|
-
isTransfer
|
|
174
|
+
isTransfer,
|
|
149
175
|
rewardAddressFromStepIdentity
|
|
150
176
|
} from "#protocol-lib";
|
|
151
177
|
var SelfSignerValidator = (signer, signee) => signer === signee;
|
|
@@ -174,7 +200,7 @@ function TransactionTransfersValidatorFactory(signerValidators = [SelfSignerVali
|
|
|
174
200
|
const signer = hydratedTx[0].from;
|
|
175
201
|
try {
|
|
176
202
|
const payloads = elevatedPayloads(hydratedTx);
|
|
177
|
-
const transfers = payloads.filter(
|
|
203
|
+
const transfers = payloads.filter(isTransfer);
|
|
178
204
|
for (const transfer of transfers) {
|
|
179
205
|
if (isUndefined(signerValidators.find((v) => v(signer, transfer.from, transfer.context)))) {
|
|
180
206
|
errors.push(new HydratedTransactionValidationError(
|
|
@@ -220,10 +246,10 @@ function signerValidatorsFromAuthorizations(authorizations = []) {
|
|
|
220
246
|
}
|
|
221
247
|
|
|
222
248
|
// src/modules/validation/transaction/validators/TransactionBoundWitnessValidator.ts
|
|
223
|
-
import { ZERO_HASH as
|
|
249
|
+
import { ZERO_HASH as ZERO_HASH4 } from "@ariestools/sdk";
|
|
224
250
|
import { BoundWitnessValidator as BoundWitnessValidator2 } from "@xyo-network/sdk";
|
|
225
251
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError2 } from "#protocol-lib";
|
|
226
|
-
var error = (tx, message) => new HydratedTransactionValidationError2(tx?.[0]?._hash ??
|
|
252
|
+
var error = (tx, message) => new HydratedTransactionValidationError2(tx?.[0]?._hash ?? ZERO_HASH4, tx, message);
|
|
227
253
|
var checkSignaturesShape = (tx) => {
|
|
228
254
|
const bw = tx[0];
|
|
229
255
|
if (bw.$signatures === void 0) {
|
|
@@ -244,23 +270,23 @@ var TransactionBoundWitnessValidator = async (context, tx) => {
|
|
|
244
270
|
};
|
|
245
271
|
|
|
246
272
|
// src/modules/validation/transaction/validators/TransactionDurationValidator.ts
|
|
247
|
-
import { ZERO_HASH as
|
|
273
|
+
import { ZERO_HASH as ZERO_HASH5 } from "@ariestools/sdk";
|
|
248
274
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError3 } from "#protocol-lib";
|
|
249
275
|
var TransactionDurationValidator = (context, tx) => {
|
|
250
276
|
const errors = [];
|
|
251
277
|
try {
|
|
252
278
|
const { exp, nbf } = tx[0];
|
|
253
|
-
if (nbf < 0) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ??
|
|
254
|
-
if (exp < 0) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ??
|
|
255
|
-
if (exp <= nbf) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ??
|
|
279
|
+
if (nbf < 0) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, "Transaction nbf must be positive"));
|
|
280
|
+
if (exp < 0) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, "Transaction exp must be positive"));
|
|
281
|
+
if (exp <= nbf) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, "Transaction exp must greater than nbf"));
|
|
256
282
|
if (exp - nbf > 1e4) errors.push(new HydratedTransactionValidationError3(
|
|
257
|
-
tx?.[0]?._hash ??
|
|
283
|
+
tx?.[0]?._hash ?? ZERO_HASH5,
|
|
258
284
|
tx,
|
|
259
285
|
"Transaction exp must not be too far in the future"
|
|
260
286
|
));
|
|
261
287
|
} catch (ex) {
|
|
262
288
|
errors.push(new HydratedTransactionValidationError3(
|
|
263
|
-
tx?.[0]?._hash ??
|
|
289
|
+
tx?.[0]?._hash ?? ZERO_HASH5,
|
|
264
290
|
tx,
|
|
265
291
|
`Failed TransactionDurationValidator: ${String(ex)}`,
|
|
266
292
|
ex
|
|
@@ -270,7 +296,7 @@ var TransactionDurationValidator = (context, tx) => {
|
|
|
270
296
|
};
|
|
271
297
|
|
|
272
298
|
// src/modules/validation/transaction/validators/TransactionElevationValidator.ts
|
|
273
|
-
import { ZERO_HASH as
|
|
299
|
+
import { ZERO_HASH as ZERO_HASH6 } from "@ariestools/sdk";
|
|
274
300
|
import { extractElevatedHashes, HydratedTransactionValidationError as HydratedTransactionValidationError4 } from "#protocol-lib";
|
|
275
301
|
var TransactionElevationValidator = (context, tx) => {
|
|
276
302
|
const errors = [];
|
|
@@ -278,11 +304,11 @@ var TransactionElevationValidator = (context, tx) => {
|
|
|
278
304
|
try {
|
|
279
305
|
extractElevatedHashes(tx);
|
|
280
306
|
} catch {
|
|
281
|
-
errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ??
|
|
307
|
+
errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "Hydrated transaction does not include all script hashes"));
|
|
282
308
|
}
|
|
283
309
|
} catch (ex) {
|
|
284
310
|
errors.push(new HydratedTransactionValidationError4(
|
|
285
|
-
tx?.[0]?._hash ??
|
|
311
|
+
tx?.[0]?._hash ?? ZERO_HASH6,
|
|
286
312
|
tx,
|
|
287
313
|
`Failed TransactionElevationValidator: ${String(ex)}`,
|
|
288
314
|
ex
|
|
@@ -292,7 +318,7 @@ var TransactionElevationValidator = (context, tx) => {
|
|
|
292
318
|
};
|
|
293
319
|
|
|
294
320
|
// src/modules/validation/transaction/validators/TransactionFromValidator.ts
|
|
295
|
-
import { ZERO_HASH as
|
|
321
|
+
import { ZERO_HASH as ZERO_HASH7 } from "@ariestools/sdk";
|
|
296
322
|
import { addressesContains, asXyoAddress } from "@xyo-network/sdk";
|
|
297
323
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError5 } from "#protocol-lib";
|
|
298
324
|
var TransactionFromValidator = (context, tx) => {
|
|
@@ -300,18 +326,18 @@ var TransactionFromValidator = (context, tx) => {
|
|
|
300
326
|
try {
|
|
301
327
|
const from = asXyoAddress(tx[0].from);
|
|
302
328
|
if (from === void 0) errors.push(new HydratedTransactionValidationError5(
|
|
303
|
-
tx?.[0]?._hash ??
|
|
329
|
+
tx?.[0]?._hash ?? ZERO_HASH7,
|
|
304
330
|
tx,
|
|
305
331
|
"Transaction from is not a valid address"
|
|
306
332
|
));
|
|
307
333
|
else if (!addressesContains(tx[0], from)) errors.push(new HydratedTransactionValidationError5(
|
|
308
|
-
tx?.[0]?._hash ??
|
|
334
|
+
tx?.[0]?._hash ?? ZERO_HASH7,
|
|
309
335
|
tx,
|
|
310
336
|
"Transaction from address must be listed in addresses"
|
|
311
337
|
));
|
|
312
338
|
} catch (ex) {
|
|
313
339
|
errors.push(new HydratedTransactionValidationError5(
|
|
314
|
-
tx?.[0]?._hash ??
|
|
340
|
+
tx?.[0]?._hash ?? ZERO_HASH7,
|
|
315
341
|
tx,
|
|
316
342
|
`Failed TransactionFromValidator: ${String(ex)}`,
|
|
317
343
|
ex
|
|
@@ -321,7 +347,7 @@ var TransactionFromValidator = (context, tx) => {
|
|
|
321
347
|
};
|
|
322
348
|
|
|
323
349
|
// src/modules/validation/transaction/validators/TransactionGasValidator.ts
|
|
324
|
-
import { hexToBigInt as hexToBigInt2, ZERO_HASH as
|
|
350
|
+
import { hexToBigInt as hexToBigInt2, ZERO_HASH as ZERO_HASH8 } from "@ariestools/sdk";
|
|
325
351
|
import {
|
|
326
352
|
AttoXL1,
|
|
327
353
|
HydratedTransactionValidationError as HydratedTransactionValidationError6,
|
|
@@ -332,7 +358,7 @@ var TransactionGasValidator = (context, tx) => {
|
|
|
332
358
|
try {
|
|
333
359
|
if (tx?.[0].fees === void 0) {
|
|
334
360
|
errors.push(new HydratedTransactionValidationError6(
|
|
335
|
-
tx?.[0]?._hash ??
|
|
361
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
336
362
|
tx,
|
|
337
363
|
"Missing fees"
|
|
338
364
|
));
|
|
@@ -344,51 +370,51 @@ var TransactionGasValidator = (context, tx) => {
|
|
|
344
370
|
priority
|
|
345
371
|
} = parseFees(tx[0].fees);
|
|
346
372
|
if (base === void 0) errors.push(new HydratedTransactionValidationError6(
|
|
347
|
-
tx?.[0]?._hash ??
|
|
373
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
348
374
|
tx,
|
|
349
375
|
"fees.base must be defined and a valid number"
|
|
350
376
|
));
|
|
351
377
|
else if (base < minTransactionFees.base) errors.push(new HydratedTransactionValidationError6(
|
|
352
|
-
tx?.[0]?._hash ??
|
|
378
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
353
379
|
tx,
|
|
354
380
|
`fees.base must be >= ${minTransactionFees.base}`
|
|
355
381
|
));
|
|
356
382
|
if (gasLimit === void 0) errors.push(new HydratedTransactionValidationError6(
|
|
357
|
-
tx?.[0]?._hash ??
|
|
383
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
358
384
|
tx,
|
|
359
385
|
"fees.gasLimit must be defined and a valid number"
|
|
360
386
|
));
|
|
361
387
|
else if (gasLimit < minTransactionFees.gasLimit) errors.push(new HydratedTransactionValidationError6(
|
|
362
|
-
tx?.[0]?._hash ??
|
|
388
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
363
389
|
tx,
|
|
364
390
|
`fees.gasLimit must be >= ${minTransactionFees.gasLimit}`
|
|
365
391
|
));
|
|
366
392
|
if (gasPrice === void 0) errors.push(
|
|
367
393
|
new HydratedTransactionValidationError6(
|
|
368
|
-
tx?.[0]?._hash ??
|
|
394
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
369
395
|
tx,
|
|
370
396
|
"fees.gasPrice must be defined and a valid number"
|
|
371
397
|
)
|
|
372
398
|
);
|
|
373
399
|
else if (gasPrice < minTransactionFees.gasPrice) errors.push(new HydratedTransactionValidationError6(
|
|
374
|
-
tx?.[0]?._hash ??
|
|
400
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
375
401
|
tx,
|
|
376
402
|
`fees.gasPrice must be >= ${minTransactionFees.gasPrice}`
|
|
377
403
|
));
|
|
378
404
|
if (priority === void 0) errors.push(new HydratedTransactionValidationError6(
|
|
379
|
-
tx?.[0]?._hash ??
|
|
405
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
380
406
|
tx,
|
|
381
407
|
"fees.priority must be defined and a valid number"
|
|
382
408
|
));
|
|
383
409
|
else if (priority < minTransactionFees.priority) errors.push(new HydratedTransactionValidationError6(
|
|
384
|
-
tx?.[0]?._hash ??
|
|
410
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
385
411
|
tx,
|
|
386
412
|
`fees.priority must be >= ${minTransactionFees.priority}`
|
|
387
413
|
));
|
|
388
414
|
}
|
|
389
415
|
} catch (ex) {
|
|
390
416
|
errors.push(new HydratedTransactionValidationError6(
|
|
391
|
-
tx?.[0]?._hash ??
|
|
417
|
+
tx?.[0]?._hash ?? ZERO_HASH8,
|
|
392
418
|
tx,
|
|
393
419
|
`Failed TransactionGasValidator: ${String(ex)}`,
|
|
394
420
|
ex
|
|
@@ -412,7 +438,7 @@ var parseFees = (fees) => {
|
|
|
412
438
|
};
|
|
413
439
|
|
|
414
440
|
// src/modules/validation/transaction/validators/TransactionJsonSchemaValidator.ts
|
|
415
|
-
import { ZERO_HASH as
|
|
441
|
+
import { ZERO_HASH as ZERO_HASH9 } from "@ariestools/sdk";
|
|
416
442
|
import { PayloadBuilder } from "@xyo-network/sdk";
|
|
417
443
|
import { Ajv } from "ajv";
|
|
418
444
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError7 } from "#protocol-lib";
|
|
@@ -425,7 +451,7 @@ var TransactionJsonSchemaValidator = (context, tx) => {
|
|
|
425
451
|
validate ??= ajv.compile(TransactionBoundWitnessJsonSchema);
|
|
426
452
|
if (!validate(PayloadBuilder.omitStorageMeta(tx[0]))) {
|
|
427
453
|
const error2 = new HydratedTransactionValidationError7(
|
|
428
|
-
tx?.[0]?._hash ??
|
|
454
|
+
tx?.[0]?._hash ?? ZERO_HASH9,
|
|
429
455
|
tx,
|
|
430
456
|
`failed JSON schema validation: ${ajv.errorsText(validate.errors, { separator: "\n" })}`,
|
|
431
457
|
validate.errors
|
|
@@ -433,22 +459,22 @@ var TransactionJsonSchemaValidator = (context, tx) => {
|
|
|
433
459
|
errors.push(error2);
|
|
434
460
|
}
|
|
435
461
|
} catch (ex) {
|
|
436
|
-
errors.push(new HydratedTransactionValidationError7(tx?.[0]?._hash ??
|
|
462
|
+
errors.push(new HydratedTransactionValidationError7(tx?.[0]?._hash ?? ZERO_HASH9, tx, "validation excepted", ex));
|
|
437
463
|
}
|
|
438
464
|
return errors;
|
|
439
465
|
};
|
|
440
466
|
|
|
441
467
|
// src/modules/validation/transaction/validators/TransactionProtocolValidator.ts
|
|
442
|
-
import { ZERO_HASH as
|
|
468
|
+
import { ZERO_HASH as ZERO_HASH10 } from "@ariestools/sdk";
|
|
443
469
|
import { HydratedTransactionValidationError as HydratedTransactionValidationError8 } from "#protocol-lib";
|
|
444
470
|
var TransactionProtocolValidator = async (context, tx) => {
|
|
445
471
|
const errors = [];
|
|
446
472
|
try {
|
|
447
473
|
if (context?.chainId !== void 0 && tx[0].chain !== context.chainId) {
|
|
448
|
-
errors.push(new HydratedTransactionValidationError8(tx?.[0]?._hash ??
|
|
474
|
+
errors.push(new HydratedTransactionValidationError8(tx?.[0]?._hash ?? ZERO_HASH10, tx, `invalid chain id [${context.chainId}, ${tx[0].chain}]`));
|
|
449
475
|
}
|
|
450
476
|
} catch (ex) {
|
|
451
|
-
errors.push(new HydratedTransactionValidationError8(tx?.[0]?._hash ??
|
|
477
|
+
errors.push(new HydratedTransactionValidationError8(tx?.[0]?._hash ?? ZERO_HASH10, tx, "validation excepted", ex));
|
|
452
478
|
}
|
|
453
479
|
return await Promise.resolve(errors);
|
|
454
480
|
};
|
|
@@ -459,7 +485,7 @@ var validateTransaction = async (context, tx, additionalValidators) => {
|
|
|
459
485
|
if (!isTransactionBoundWitness(tx[0])) {
|
|
460
486
|
const castTx = tx.at(0);
|
|
461
487
|
return [new HydratedTransactionValidationError9(
|
|
462
|
-
asHashMeta(castTx)?._hash ??
|
|
488
|
+
asHashMeta(castTx)?._hash ?? ZERO_HASH11,
|
|
463
489
|
tx,
|
|
464
490
|
"failed isTransactionBoundWitness identity check"
|
|
465
491
|
)];
|
|
@@ -478,7 +504,7 @@ var validateTransaction = async (context, tx, additionalValidators) => {
|
|
|
478
504
|
} catch (ex) {
|
|
479
505
|
const castTx = tx?.[0];
|
|
480
506
|
return [new HydratedTransactionValidationError9(
|
|
481
|
-
castTx?._hash ??
|
|
507
|
+
castTx?._hash ?? ZERO_HASH11,
|
|
482
508
|
tx,
|
|
483
509
|
"Failed TransactionGasValidator: " + ex.message,
|
|
484
510
|
ex
|
|
@@ -504,6 +530,7 @@ export {
|
|
|
504
530
|
TransactionProtocolValidator,
|
|
505
531
|
TransactionTransfersValidatorFactory,
|
|
506
532
|
accumulateOutflows,
|
|
533
|
+
findMalformedTransfers,
|
|
507
534
|
signerValidatorsFromAuthorizations,
|
|
508
535
|
validateTransaction
|
|
509
536
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/modules/validation/block/validators/BlockCumulativeBalanceValidator.ts", "../../src/modules/validation/boundwitness/validators/BoundWitnessReferences.ts", "../../src/modules/validation/boundwitness/validators/BoundWitnessSignatures.ts", "../../src/modules/validation/transaction/validateTransaction.ts", "../../src/modules/validation/transaction/validators/SignerAuthorization.ts", "../../src/modules/validation/transaction/validators/TransactionTransfersValidator.ts", "../../src/modules/validation/transaction/validators/TransactionBoundWitnessValidator.ts", "../../src/modules/validation/transaction/validators/TransactionDurationValidator.ts", "../../src/modules/validation/transaction/validators/TransactionElevationValidator.ts", "../../src/modules/validation/transaction/validators/TransactionFromValidator.ts", "../../src/modules/validation/transaction/validators/TransactionGasValidator.ts", "../../src/modules/validation/transaction/validators/TransactionJsonSchemaValidator.ts", "../../src/modules/validation/transaction/validators/TransactionProtocolValidator.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Hex, hexToBigInt } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\n\nimport type {\n HydratedBlockStateValidationFunction,\n HydratedBlockWithHashMeta,\n TransactionBoundWitnessWithHashMeta,\n} from '#protocol-lib'\nimport {\n HydratedBlockStateValidationError,\n isTransactionBoundWitnessWithHashMeta,\n isTransfer,\n XYO_ZERO_ADDRESS,\n} from '#protocol-lib'\n\n/** Compute the maximum fee commitment for a transaction (base + priority + gasLimit). */\nfunction maxTransactionFeeCost(tx: TransactionBoundWitnessWithHashMeta): bigint {\n const {\n base, gasLimit, priority,\n } = tx.fees\n return hexToBigInt(base) + hexToBigInt(priority) + hexToBigInt(gasLimit)\n}\n\nfunction accumulateTransferOutflows(\n payload: HydratedBlockWithHashMeta[1][number],\n txPayloadHashes: Set<string>,\n outflows: Record<XyoAddress, bigint>,\n): void {\n if (!txPayloadHashes.has(payload._hash) || !isTransfer(payload)) return\n const { from } = payload\n for (const [to, amount] of Object.entries(payload.transfers) as [XyoAddress, Hex][]) {\n if (to !== from) {\n outflows[from] = (outflows[from] ?? 0n) + hexToBigInt(amount)\n }\n }\n}\n\n/** Accumulate outflows per address from fees and transfers in the given transactions. */\nexport function accumulateOutflows(\n transactions: TransactionBoundWitnessWithHashMeta[],\n payloads: HydratedBlockWithHashMeta[1],\n): Record<XyoAddress, bigint> {\n const outflows: Record<XyoAddress, bigint> = {}\n\n for (const tx of transactions) {\n // Fee cost charged to the transaction sender\n const feeCost = maxTransactionFeeCost(tx)\n const feePayer = tx.from\n outflows[feePayer] = (outflows[feePayer] ?? 0n) + feeCost\n\n // Find transfer payloads belonging to this transaction\n const txPayloadHashes = new Set(tx.payload_hashes)\n for (const payload of payloads) {\n accumulateTransferOutflows(payload, txPayloadHashes, outflows)\n }\n }\n\n return outflows\n}\n\n/** Creates a block state validator that checks cumulative outflows per address do not exceed pre-block balances. */\nexport function BlockCumulativeBalanceValidatorFactory(): HydratedBlockStateValidationFunction {\n return async (context, hydratedBlock) => {\n const [blockBw, payloads] = hydratedBlock\n\n // Find all transactions in the block\n const transactions = payloads.filter(isTransactionBoundWitnessWithHashMeta)\n\n if (transactions.length === 0) return []\n\n const outflows = accumulateOutflows(transactions, payloads)\n\n // Query pre-block balances for all addresses with outflows\n const addresses = Object.keys(outflows) as XyoAddress[]\n if (addresses.length === 0) return []\n\n const balances = await context.accountBalance.accountBalances(addresses)\n\n // Check each address\n const chainId = await context.chainIdAtBlockNumber(blockBw.block)\n const errors: HydratedBlockStateValidationError[] = []\n for (const address of addresses) {\n if (address === XYO_ZERO_ADDRESS) continue // Skip zero address as it's used for burn transactions and doesn't have a balance\n // TODO: Add specific validation for block reward transfer\n const balance = balances[address] ?? 0n\n const totalOutflow = outflows[address]\n if (totalOutflow > balance) {\n errors.push(new HydratedBlockStateValidationError(\n blockBw._hash,\n chainId,\n hydratedBlock,\n `Cumulative outflow for address ${address} exceeds available balance: outflow ${totalOutflow} > balance ${balance}`,\n ))\n }\n }\n\n return errors\n }\n}\n", "import type { Hash, Promisable } from '@ariestools/sdk'\nimport { ZERO_HASH } from '@ariestools/sdk'\nimport type {\n BoundWitness,\n Payload,\n Schema,\n WithHashMeta,\n} from '@xyo-network/sdk'\nimport { isAnyPayload } from '@xyo-network/sdk'\n\nimport type { HydratedBoundWitnessValidationFunction, HydratedBoundWitnessWithHashMeta } from '#protocol-lib'\nimport { HydratedBoundWitnessValidationError } from '#protocol-lib'\n\nfunction getPayloadsFromPayloadArray(payloads: WithHashMeta<Payload>[], hashes: Hash[]): (WithHashMeta<Payload> | undefined)[] {\n return hashes.map(hash => payloads.find(payload => payload._hash === hash || payload._dataHash === hash))\n}\n\n/** Creates a validator that checks all payload references in a BoundWitness are present, have matching schemas, and optionally conform to an allowed schema list. */\nexport const BoundWitnessReferencesValidator\n\n = <T extends BoundWitness = BoundWitness>(allowedSchemas?: Schema[]): HydratedBoundWitnessValidationFunction<T> => (\n [bw, payloadSet]: HydratedBoundWitnessWithHashMeta<T>,\n // eslint-disable-next-line complexity\n ): Promisable<HydratedBoundWitnessValidationError[]> => {\n const errors: HydratedBoundWitnessValidationError[] = []\n try {\n const payloads = getPayloadsFromPayloadArray(payloadSet, bw.payload_hashes)\n if (payloads.length !== bw.payload_hashes.length) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'unable to locate payloads'))\n }\n\n // check if payloads are valid and if their schemas match the declared schemas\n for (const payload of payloads) {\n if (isAnyPayload(payload)) {\n const payloadHashIndex = bw.payload_hashes.indexOf(payload._hash)\n const payloadDataHashIndex = bw.payload_hashes.indexOf(payload._dataHash)\n const payloadIndex = Math.max(payloadHashIndex, payloadDataHashIndex)\n if (payloadIndex === -1) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'payload hash not found'))\n }\n\n const declaredSchema = bw.payload_schemas[payloadIndex]\n if (declaredSchema !== payload.schema) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'mismatched schema'))\n }\n\n if (allowedSchemas && !allowedSchemas.includes(payload.schema)) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `disallowed schema [${payload.schema}]`))\n }\n } else {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'invalid payload'))\n }\n }\n } catch (ex) {\n const error = new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `validation excepted: ${String(ex)}`, ex)\n errors.push(error)\n }\n return errors\n }\n", "import { toArrayBuffer, ZERO_HASH } from '@ariestools/sdk'\nimport type {\n BoundWitness, WithStorageMeta, XyoAddress,\n} from '@xyo-network/sdk'\nimport { BoundWitnessBuilder, BoundWitnessValidator } from '@xyo-network/sdk'\n\nimport type { BoundWitnessValidationFunction } from '#protocol-lib'\nimport { BoundWitnessValidationError } from '#protocol-lib'\n\n/** Validates that all signatures on a BoundWitness are cryptographically valid for their corresponding addresses. */\nexport const BoundWitnessSignaturesValidator: BoundWitnessValidationFunction = async (\n bw: BoundWitness,\n) => {\n const errors: BoundWitnessValidationError[] = []\n try {\n const dataHash = await BoundWitnessBuilder.dataHash(bw)\n const results: [XyoAddress, Error[]][] = await Promise.all(bw.addresses.map(async (address, index) => {\n return [address, await BoundWitnessValidator.validateSignature(\n toArrayBuffer(dataHash),\n address,\n toArrayBuffer(bw.$signatures[index] ?? undefined),\n )]\n }))\n for (const [, bwErrors] of results) {\n for (const bwError of bwErrors) {\n errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation errors', bwError))\n }\n }\n } catch (ex) {\n errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation excepted', ex))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { asHashMeta } from '@xyo-network/sdk'\n\nimport type {\n HydratedTransactionValidationFunction,\n HydratedTransactionValidationFunctionContext,\n HydratedTransactionWithHashMeta,\n} from '#protocol-lib'\nimport { HydratedTransactionValidationError, isTransactionBoundWitness } from '#protocol-lib'\n\nimport {\n TransactionBoundWitnessValidator,\n TransactionDurationValidator,\n TransactionElevationValidator, TransactionFromValidator, TransactionGasValidator, TransactionProtocolValidator,\n} from './validators/index.ts'\n\n/** Validates a hydrated transaction using built-in validators plus any additional validators provided. */\nexport const validateTransaction: HydratedTransactionValidationFunction = async (\n context: HydratedTransactionValidationFunctionContext,\n tx: HydratedTransactionWithHashMeta,\n additionalValidators?: HydratedTransactionValidationFunction[],\n): Promise<HydratedTransactionValidationError[]> => {\n try {\n if (!isTransactionBoundWitness(tx[0])) {\n const castTx = tx.at(0)\n return [new HydratedTransactionValidationError(\n asHashMeta(castTx)?._hash ?? ZERO_HASH,\n tx,\n 'failed isTransactionBoundWitness identity check',\n )]\n }\n\n const validators: HydratedTransactionValidationFunction<HydratedTransactionValidationFunctionContext>[] = [\n TransactionProtocolValidator,\n TransactionDurationValidator,\n TransactionFromValidator,\n TransactionGasValidator,\n TransactionElevationValidator,\n TransactionBoundWitnessValidator,\n ...(additionalValidators ?? []),\n ]\n const validationResults = await Promise.all(validators.map(async v => v(context, tx)))\n return validationResults.flat()\n } catch (ex) {\n const castTx = tx?.[0]\n return [new HydratedTransactionValidationError(\n castTx?._hash ?? ZERO_HASH,\n tx,\n 'Failed TransactionGasValidator: ' + (ex as Error).message,\n ex,\n )]\n }\n}\n", "import { XyoAddressZod } from '@xyo-network/sdk'\nimport { z } from 'zod'\n\nimport type { SignerValidator } from './TransactionTransfersValidator.ts'\nimport {\n CompletedStepRewardAddressValidatorFactory, DerivedReceiveAddressValidatorFactory, SelfSignerValidator,\n} from './TransactionTransfersValidator.ts'\n\n/** Authorizes the listed signers to sign for completed-step-reward addresses. */\nexport const CompletedStepRewardAuthorizationZod = z.object({\n type: z.literal('completedStepReward'),\n signers: z.array(XyoAddressZod),\n}).describe('Authorizes signers for completed-step-reward addresses')\n\n/** Authorizes the listed signers to sign for derived-receive addresses within a scope. */\nexport const DerivedReceiveAuthorizationZod = z.object({\n type: z.literal('derivedReceive'),\n scope: z.string(),\n signers: z.array(XyoAddressZod),\n}).describe('Authorizes signers for derived-receive addresses within a scope')\n\n/** A single signer authorization, discriminated by `type` (the deriving-function selector). */\nexport const SignerAuthorizationZod = z.discriminatedUnion('type', [\n CompletedStepRewardAuthorizationZod,\n DerivedReceiveAuthorizationZod,\n])\n\nexport type CompletedStepRewardAuthorization = z.infer<typeof CompletedStepRewardAuthorizationZod>\nexport type DerivedReceiveAuthorization = z.infer<typeof DerivedReceiveAuthorizationZod>\nexport type SignerAuthorization = z.infer<typeof SignerAuthorizationZod>\n\n/**\n * Registry mapping an authorization `type` to the SignerValidator factory that enforces it.\n * The exhaustive switch keeps each variant's params type-safe; add a new address family by\n * adding a union variant above and a case here.\n */\nfunction signerValidatorFromAuthorization(authorization: SignerAuthorization): SignerValidator {\n switch (authorization.type) {\n case 'completedStepReward': {\n return CompletedStepRewardAddressValidatorFactory(authorization.signers)\n }\n case 'derivedReceive': {\n return DerivedReceiveAddressValidatorFactory(authorization.signers, authorization.scope)\n }\n }\n}\n\n/**\n * Builds the `SignerValidator[]` consumed by `TransactionTransfersValidatorFactory` from a list\n * of authorizations. `SelfSignerValidator` is ALWAYS included so ordinary self-transfers pass;\n * an empty `authorizations` list therefore means \"self only\" \u2014 deny-all for reward/escrow families.\n */\nexport function signerValidatorsFromAuthorizations(authorizations: SignerAuthorization[] = []): SignerValidator[] {\n return [SelfSignerValidator, ...authorizations.map(signerValidatorFromAuthorization)]\n}\n", "import { isDefined, isUndefined } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\n\nimport type {\n HydratedTransactionValidationFunction, StepIdentity,\n Transfer,\n} from '#protocol-lib'\nimport {\n derivedReceiveAddress,\n elevatedPayloads,\n HydratedTransactionValidationError,\n isTransfer,\n rewardAddressFromStepIdentity,\n} from '#protocol-lib'\n\n/** Function type that checks whether a signer is authorized to sign for a given signee address. */\nexport type SignerValidator = (signer: XyoAddress, signee: XyoAddress, context?: { address?: XyoAddress; scope?: string; step?: StepIdentity }) => boolean\n\n/** A signer validator that only allows an address to sign for itself. */\nexport const SelfSignerValidator: SignerValidator = (signer: XyoAddress, signee: XyoAddress) => signer === signee\n\n/** Creates a signer validator that authorizes specified signers to sign for completed step reward addresses. */\nexport const CompletedStepRewardAddressValidatorFactory = (allowedSigners: XyoAddress[]): SignerValidator => (\n signer: XyoAddress,\n signee: XyoAddress,\n context?: { step?: StepIdentity },\n) => {\n const step = context?.step\n if (isDefined(step)) {\n const contextAddress = rewardAddressFromStepIdentity(step)\n return allowedSigners.includes(signer) && signee === contextAddress\n }\n return false\n}\n\n/** Creates a signer validator that authorizes specified signers to sign for derived receive addresses within a given scope. */\nexport const DerivedReceiveAddressValidatorFactory = (allowedSigners: XyoAddress[], allowedScope: string): SignerValidator => (\n signer: XyoAddress,\n signee: XyoAddress,\n context?: { address?: XyoAddress; scope?: string },\n) => {\n const { address, scope } = context ?? {}\n if (scope !== allowedScope) {\n return false\n }\n if (isDefined(address)) {\n const derivedAddress = derivedReceiveAddress(address, scope)\n return allowedSigners.includes(signer) && signee === derivedAddress\n }\n return false\n}\n\n/** Creates a transaction validator that checks all transfers are authorized by the transaction signer. */\nexport function TransactionTransfersValidatorFactory(\n signerValidators: SignerValidator[] = [SelfSignerValidator],\n): HydratedTransactionValidationFunction {\n return async (\n context,\n hydratedTx,\n ) => {\n const errors: HydratedTransactionValidationError[] = []\n const signer = hydratedTx[0].from\n try {\n const payloads = elevatedPayloads(hydratedTx)\n const transfers = payloads.filter(isTransfer) as Transfer[]\n for (const transfer of transfers) {\n if (isUndefined(signerValidators.find(v => v(signer, transfer.from, transfer.context)))) {\n errors.push(new HydratedTransactionValidationError(\n hydratedTx[0]._hash,\n hydratedTx,\n `transfer from address ${transfer.from} is not authorized by signer ${signer}`,\n ))\n }\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(hydratedTx[0]._hash, hydratedTx, 'validation excepted', ex))\n }\n return await Promise.resolve(errors)\n }\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { BoundWitnessValidator } from '@xyo-network/sdk'\n\nimport type { HydratedTransactionValidationFunction, HydratedTransactionWithHashMeta } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\nconst error = (tx: HydratedTransactionWithHashMeta, message: string): HydratedTransactionValidationError =>\n new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, message)\n\n// Friendly pre-check for the wallet bug we want to surface clearly: signatures\n// emitted under `signatures` instead of `$signatures`. The downstream\n// BoundWitnessValidator would also catch the missing/mismatched signatures,\n// but its message (\"Length mismatch: address/signature\", \"Missing signature\n// [<address>]\") doesn't hint at the actual root cause.\nconst checkSignaturesShape = (tx: HydratedTransactionWithHashMeta): HydratedTransactionValidationError[] => {\n const bw = tx[0] as unknown as Record<string, unknown>\n if (bw.$signatures === undefined) {\n return Array.isArray(bw.signatures)\n ? [error(tx, 'BoundWitness has `signatures` but expected `$signatures` (signatures must be in the meta-prefixed `$signatures` key)')]\n : [error(tx, 'BoundWitness is missing `$signatures`')]\n }\n return []\n}\n\n/**\n * Validates the transaction's BoundWitness wholistically by delegating to\n * `BoundWitnessValidator.validate()`. This covers:\n * - signatures: length matches addresses, every signature is cryptographically\n * valid for its corresponding address against the BW data hash\n * - addresses: uniqueness\n * - array length parity: payload_hashes vs payload_schemas\n * - schemas: per-schema name validators\n * - top-level schema check\n * - PayloadValidator.schemaName check\n *\n * Also emits a friendly diagnostic when the common wallet bug of\n * `signatures` vs `$signatures` is detected, so the failure points at the\n * actual root cause instead of buried length/missing-signature errors.\n */\nexport const TransactionBoundWitnessValidator: HydratedTransactionValidationFunction = async (\n context,\n tx,\n) => {\n try {\n const shapeErrors = checkSignaturesShape(tx)\n if (shapeErrors.length > 0) return shapeErrors\n const bwValidator = new BoundWitnessValidator(tx[0])\n const bwErrors = await bwValidator.validate()\n return bwErrors.map(e => error(tx, `BoundWitness validation: ${e.message}`))\n } catch (ex) {\n return [error(tx, `Failed TransactionBoundWitnessValidator: ${String(ex)}`)]\n }\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that transaction timing fields (nbf and exp) are positive, correctly ordered, and within allowed duration limits. */\nexport const TransactionDurationValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n// eslint-disable-next-line complexity\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n const { exp, nbf } = tx[0]\n if (nbf < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction nbf must be positive'))\n\n if (exp < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction exp must be positive'))\n if (exp <= nbf) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction exp must greater than nbf'))\n if (exp - nbf > 10_000) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction exp must not be too far in the future',\n ))\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionDurationValidator: ${String(ex)}`,\n ex,\n ))\n }\n\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { extractElevatedHashes, HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that a hydrated transaction includes all required elevated script hashes. */\nexport const TransactionElevationValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n try {\n extractElevatedHashes(tx)\n } catch {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Hydrated transaction does not include all script hashes'))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionElevationValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { addressesContains, asXyoAddress } from '@xyo-network/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that the transaction's from field is a valid address and is included in the BoundWitness addresses. */\nexport const TransactionFromValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n const from = asXyoAddress(tx[0].from)\n if (from === undefined)errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction from is not a valid address',\n ))\n else if (!addressesContains(tx[0], from)) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction from address must be listed in addresses',\n ))\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionFromValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n", "import { hexToBigInt, ZERO_HASH } from '@ariestools/sdk'\n\nimport type {\n HydratedTransactionValidationFunction,\n TransactionFeesBigInt, TransactionFeesHex,\n} from '#protocol-lib'\nimport {\n AttoXL1,\n HydratedTransactionValidationError,\n minTransactionFees,\n} from '#protocol-lib'\n\n/** Validates that transaction fee fields (base, gasLimit, gasPrice, priority) are present and meet minimum requirements. */\nexport const TransactionGasValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n// eslint-disable-next-line complexity\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (tx?.[0].fees === undefined) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Missing fees',\n ))\n } else {\n const {\n base, gasLimit, gasPrice, priority,\n } = parseFees(tx[0].fees)\n\n if (base === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.base must be defined and a valid number',\n ))\n else if (base < minTransactionFees.base) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.base must be >= ${minTransactionFees.base}`,\n ))\n\n if (gasLimit === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.gasLimit must be defined and a valid number',\n ))\n else if (gasLimit < minTransactionFees.gasLimit) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.gasLimit must be >= ${minTransactionFees.gasLimit}`,\n ))\n\n if (gasPrice === undefined) errors.push(\n new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.gasPrice must be defined and a valid number',\n ),\n )\n else if (gasPrice < minTransactionFees.gasPrice) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.gasPrice must be >= ${minTransactionFees.gasPrice}`,\n ))\n\n if (priority === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.priority must be defined and a valid number',\n ))\n else if (priority < minTransactionFees.priority) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.priority must be >= ${minTransactionFees.priority}`,\n ))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionGasValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n\nconst parseFees = (fees: TransactionFeesHex): Partial<TransactionFeesBigInt> => {\n const ret: Partial<TransactionFeesBigInt> = {}\n const {\n base, gasLimit, gasPrice, priority,\n } = fees\n if (base !== undefined) ret.base = AttoXL1(hexToBigInt(base))\n if (gasLimit !== undefined) ret.gasLimit = AttoXL1(hexToBigInt(gasLimit))\n if (gasPrice !== undefined) ret.gasPrice = AttoXL1(hexToBigInt(gasPrice))\n if (priority !== undefined) ret.priority = AttoXL1(hexToBigInt(priority))\n return ret\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type { ValidateFunction } from 'ajv'\nimport { Ajv } from 'ajv'\n\nimport type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\nimport { TransactionBoundWitnessJsonSchema } from '#schema'\n\nconst ajv = new Ajv({ allErrors: true, strict: true })\n\nlet validate: ValidateFunction<TransactionBoundWitness> | undefined\n\n/** Validates a transaction against the TransactionBoundWitness JSON schema using AJV. */\nexport const TransactionJsonSchemaValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n validate ??= ajv.compile(TransactionBoundWitnessJsonSchema)\n if (!validate(PayloadBuilder.omitStorageMeta(tx[0]))) {\n const error = new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `failed JSON schema validation: ${ajv.errorsText(validate.errors, { separator: '\\n' })}`,\n validate.errors,\n )\n errors.push(error)\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type {\n ChainId,\n HydratedTransactionValidationFunction,\n} from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that the transaction's chain ID matches the expected chain ID from the validation context. */\nexport const TransactionProtocolValidator: HydratedTransactionValidationFunction = async (\n context: { chainId?: ChainId },\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (context?.chainId !== undefined && tx[0].chain !== context.chainId) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, `invalid chain id [${context.chainId}, ${tx[0].chain}]`))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))\n }\n return await Promise.resolve(errors)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import {\n type Hex, hexToBigInt, ZERO_HASH,\n} from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\n\nimport type {\n HydratedBlockStateValidationFunction,\n HydratedBlockWithHashMeta,\n TransactionBoundWitnessWithHashMeta,\n} from '#protocol-lib'\nimport {\n HydratedBlockStateValidationError,\n isTransactionBoundWitnessWithHashMeta,\n isTransferPayload,\n TransferSchema,\n XYO_ZERO_ADDRESS,\n} from '#protocol-lib'\n\n/** Compute the maximum fee commitment for a transaction (base + priority + gasLimit). */\nfunction maxTransactionFeeCost(tx: TransactionBoundWitnessWithHashMeta): bigint {\n const {\n base, gasLimit, priority,\n } = tx.fees\n return hexToBigInt(base) + hexToBigInt(priority) + hexToBigInt(gasLimit)\n}\n\nfunction accumulateTransferOutflows(\n payload: HydratedBlockWithHashMeta[1][number],\n txPayloadHashes: Set<string>,\n outflows: Record<XyoAddress, bigint>,\n): void {\n // Transfers are matched by _hash only. Producer-synthesized system transfers (fee burn,\n // gas payment, block reward) are intentionally unreferenced by any transaction and thus\n // excluded \u2014 the sender's fee commitment is already charged via maxTransactionFeeCost.\n // Note: _dataHash references, though accepted by BoundWitnessReferencesValidator, do not\n // count here and are therefore never balance-checked.\n if (!txPayloadHashes.has(payload._hash) || !isTransferPayload(payload)) return\n const { from } = payload\n for (const [to, amount] of Object.entries(payload.transfers) as [XyoAddress, Hex][]) {\n if (to !== from) {\n outflows[from] = (outflows[from] ?? 0n) + hexToBigInt(amount)\n }\n }\n}\n\n/** Accumulate outflows per address from fees and transfers in the given transactions. */\nexport function accumulateOutflows(\n transactions: TransactionBoundWitnessWithHashMeta[],\n payloads: HydratedBlockWithHashMeta[1],\n): Record<XyoAddress, bigint> {\n const outflows: Record<XyoAddress, bigint> = {}\n\n for (const tx of transactions) {\n // Fee cost charged to the transaction sender\n const feeCost = maxTransactionFeeCost(tx)\n const feePayer = tx.from\n outflows[feePayer] = (outflows[feePayer] ?? 0n) + feeCost\n\n // Find transfer payloads belonging to this transaction\n const txPayloadHashes = new Set(tx.payload_hashes)\n for (const payload of payloads) {\n accumulateTransferOutflows(payload, txPayloadHashes, outflows)\n }\n }\n\n return outflows\n}\n\n/**\n * Find transaction-referenced payloads that claim the Transfer schema but fail full Transfer\n * validation. These must be surfaced as errors rather than skipped: balance application treats\n * every payload with the Transfer schema as a transfer, so a malformed one that validation\n * ignores would still be applied (or crash the applier).\n */\nexport function findMalformedTransfers(\n transactions: TransactionBoundWitnessWithHashMeta[],\n payloads: HydratedBlockWithHashMeta[1],\n): HydratedBlockWithHashMeta[1] {\n const referenced = new Set(transactions.flatMap(tx => tx.payload_hashes))\n return payloads.filter(payload =>\n referenced.has(payload._hash)\n && payload.schema === TransferSchema\n && !isTransferPayload(payload))\n}\n\n/** Creates a block state validator that checks cumulative outflows per address do not exceed pre-block balances. */\nexport function BlockCumulativeBalanceValidatorFactory(): HydratedBlockStateValidationFunction {\n return async (context, hydratedBlock) => {\n const [blockBw, payloads] = hydratedBlock\n try {\n // Find all transactions in the block\n const transactions = payloads.filter(isTransactionBoundWitnessWithHashMeta)\n\n if (transactions.length === 0) return []\n\n const chainId = await context.chainIdAtBlockNumber(blockBw.block)\n const errors: HydratedBlockStateValidationError[] = []\n\n for (const malformed of findMalformedTransfers(transactions, payloads)) {\n errors.push(new HydratedBlockStateValidationError(\n blockBw._hash,\n chainId,\n hydratedBlock,\n `Transaction-referenced payload ${malformed._hash} claims the Transfer schema but is not a valid Transfer`,\n ))\n }\n\n const outflows = accumulateOutflows(transactions, payloads)\n\n // Query pre-block balances for all addresses with outflows\n const addresses = Object.keys(outflows) as XyoAddress[]\n if (addresses.length === 0) return errors\n\n const balances = await context.accountBalance.accountBalances(addresses)\n\n // Check each address\n for (const address of addresses) {\n if (address === XYO_ZERO_ADDRESS) continue // Skip zero address as it's used for burn transactions and doesn't have a balance\n // TODO: Add specific validation for block reward transfer\n const balance = balances[address] ?? 0n\n const totalOutflow = outflows[address]\n if (totalOutflow > balance) {\n errors.push(new HydratedBlockStateValidationError(\n blockBw._hash,\n chainId,\n hydratedBlock,\n `Cumulative outflow for address ${address} exceeds available balance: outflow ${totalOutflow} > balance ${balance}`,\n ))\n }\n }\n\n return errors\n } catch (ex) {\n return [new HydratedBlockStateValidationError(\n blockBw?._hash ?? ZERO_HASH,\n blockBw?.chain,\n hydratedBlock,\n `BlockCumulativeBalanceValidator excepted: ${(ex as Error).message}`,\n ex,\n )]\n }\n }\n}\n", "import type { Hash, Promisable } from '@ariestools/sdk'\nimport { ZERO_HASH } from '@ariestools/sdk'\nimport type {\n BoundWitness,\n Payload,\n Schema,\n WithHashMeta,\n} from '@xyo-network/sdk'\nimport { isAnyPayload } from '@xyo-network/sdk'\n\nimport type { HydratedBoundWitnessValidationFunction, HydratedBoundWitnessWithHashMeta } from '#protocol-lib'\nimport { HydratedBoundWitnessValidationError } from '#protocol-lib'\n\nfunction getPayloadsFromPayloadArray(payloads: WithHashMeta<Payload>[], hashes: Hash[]): (WithHashMeta<Payload> | undefined)[] {\n return hashes.map(hash => payloads.find(payload => payload._hash === hash || payload._dataHash === hash))\n}\n\n/** Creates a validator that checks all payload references in a BoundWitness are present, have matching schemas, and optionally conform to an allowed schema list. */\nexport const BoundWitnessReferencesValidator\n\n = <T extends BoundWitness = BoundWitness>(allowedSchemas?: Schema[]): HydratedBoundWitnessValidationFunction<T> => (\n [bw, payloadSet]: HydratedBoundWitnessWithHashMeta<T>,\n // eslint-disable-next-line complexity\n ): Promisable<HydratedBoundWitnessValidationError[]> => {\n const errors: HydratedBoundWitnessValidationError[] = []\n try {\n const payloads = getPayloadsFromPayloadArray(payloadSet, bw.payload_hashes)\n if (payloads.length !== bw.payload_hashes.length) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'unable to locate payloads'))\n }\n\n // check if payloads are valid and if their schemas match the declared schemas\n for (const payload of payloads) {\n if (isAnyPayload(payload)) {\n const payloadHashIndex = bw.payload_hashes.indexOf(payload._hash)\n const payloadDataHashIndex = bw.payload_hashes.indexOf(payload._dataHash)\n const payloadIndex = Math.max(payloadHashIndex, payloadDataHashIndex)\n if (payloadIndex === -1) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'payload hash not found'))\n }\n\n const declaredSchema = bw.payload_schemas[payloadIndex]\n if (declaredSchema !== payload.schema) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'mismatched schema'))\n }\n\n if (allowedSchemas && !allowedSchemas.includes(payload.schema)) {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `disallowed schema [${payload.schema}]`))\n }\n } else {\n errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'invalid payload'))\n }\n }\n } catch (ex) {\n const error = new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `validation excepted: ${String(ex)}`, ex)\n errors.push(error)\n }\n return errors\n }\n", "import { toArrayBuffer, ZERO_HASH } from '@ariestools/sdk'\nimport type {\n BoundWitness, WithStorageMeta, XyoAddress,\n} from '@xyo-network/sdk'\nimport { BoundWitnessBuilder, BoundWitnessValidator } from '@xyo-network/sdk'\n\nimport type { BoundWitnessValidationFunction } from '#protocol-lib'\nimport { BoundWitnessValidationError } from '#protocol-lib'\n\n/** Validates that all signatures on a BoundWitness are cryptographically valid for their corresponding addresses. */\nexport const BoundWitnessSignaturesValidator: BoundWitnessValidationFunction = async (\n bw: BoundWitness,\n) => {\n const errors: BoundWitnessValidationError[] = []\n try {\n const dataHash = await BoundWitnessBuilder.dataHash(bw)\n const results: [XyoAddress, Error[]][] = await Promise.all(bw.addresses.map(async (address, index) => {\n return [address, await BoundWitnessValidator.validateSignature(\n toArrayBuffer(dataHash),\n address,\n toArrayBuffer(bw.$signatures[index] ?? undefined),\n )]\n }))\n for (const [, bwErrors] of results) {\n for (const bwError of bwErrors) {\n errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation errors', bwError))\n }\n }\n } catch (ex) {\n errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation excepted', ex))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { asHashMeta } from '@xyo-network/sdk'\n\nimport type {\n HydratedTransactionValidationFunction,\n HydratedTransactionValidationFunctionContext,\n HydratedTransactionWithHashMeta,\n} from '#protocol-lib'\nimport { HydratedTransactionValidationError, isTransactionBoundWitness } from '#protocol-lib'\n\nimport {\n TransactionBoundWitnessValidator,\n TransactionDurationValidator,\n TransactionElevationValidator, TransactionFromValidator, TransactionGasValidator, TransactionProtocolValidator,\n} from './validators/index.ts'\n\n/**\n * Validates a hydrated transaction using built-in validators plus any additional validators provided.\n *\n * Transfer authorization (`TransactionTransfersValidatorFactory`) is intentionally NOT part of the\n * built-in list: it requires deployment configuration (the node's `SignerAuthorization[]`), which is\n * not available at this layer. Chain engines MUST inject it via `additionalValidators` \u2014 otherwise\n * nothing verifies that a transfer's `from` is authorized by the transaction signer. See\n * xyo-chain `buildValidators()`, which injects it at both mempool admission and block validation.\n */\nexport const validateTransaction: HydratedTransactionValidationFunction = async (\n context: HydratedTransactionValidationFunctionContext,\n tx: HydratedTransactionWithHashMeta,\n additionalValidators?: HydratedTransactionValidationFunction[],\n): Promise<HydratedTransactionValidationError[]> => {\n try {\n if (!isTransactionBoundWitness(tx[0])) {\n const castTx = tx.at(0)\n return [new HydratedTransactionValidationError(\n asHashMeta(castTx)?._hash ?? ZERO_HASH,\n tx,\n 'failed isTransactionBoundWitness identity check',\n )]\n }\n\n const validators: HydratedTransactionValidationFunction<HydratedTransactionValidationFunctionContext>[] = [\n TransactionProtocolValidator,\n TransactionDurationValidator,\n TransactionFromValidator,\n TransactionGasValidator,\n TransactionElevationValidator,\n TransactionBoundWitnessValidator,\n ...(additionalValidators ?? []),\n ]\n const validationResults = await Promise.all(validators.map(async v => v(context, tx)))\n return validationResults.flat()\n } catch (ex) {\n const castTx = tx?.[0]\n return [new HydratedTransactionValidationError(\n castTx?._hash ?? ZERO_HASH,\n tx,\n 'Failed TransactionGasValidator: ' + (ex as Error).message,\n ex,\n )]\n }\n}\n", "import { XyoAddressZod } from '@xyo-network/sdk'\nimport { z } from 'zod'\n\nimport type { SignerValidator } from './TransactionTransfersValidator.ts'\nimport {\n CompletedStepRewardAddressValidatorFactory, DerivedReceiveAddressValidatorFactory, SelfSignerValidator,\n} from './TransactionTransfersValidator.ts'\n\n/** Authorizes the listed signers to sign for completed-step-reward addresses. */\nexport const CompletedStepRewardAuthorizationZod = z.object({\n type: z.literal('completedStepReward'),\n signers: z.array(XyoAddressZod),\n}).describe('Authorizes signers for completed-step-reward addresses')\n\n/** Authorizes the listed signers to sign for derived-receive addresses within a scope. */\nexport const DerivedReceiveAuthorizationZod = z.object({\n type: z.literal('derivedReceive'),\n scope: z.string(),\n signers: z.array(XyoAddressZod),\n}).describe('Authorizes signers for derived-receive addresses within a scope')\n\n/** A single signer authorization, discriminated by `type` (the deriving-function selector). */\nexport const SignerAuthorizationZod = z.discriminatedUnion('type', [\n CompletedStepRewardAuthorizationZod,\n DerivedReceiveAuthorizationZod,\n])\n\nexport type CompletedStepRewardAuthorization = z.infer<typeof CompletedStepRewardAuthorizationZod>\nexport type DerivedReceiveAuthorization = z.infer<typeof DerivedReceiveAuthorizationZod>\nexport type SignerAuthorization = z.infer<typeof SignerAuthorizationZod>\n\n/**\n * Registry mapping an authorization `type` to the SignerValidator factory that enforces it.\n * The exhaustive switch keeps each variant's params type-safe; add a new address family by\n * adding a union variant above and a case here.\n */\nfunction signerValidatorFromAuthorization(authorization: SignerAuthorization): SignerValidator {\n switch (authorization.type) {\n case 'completedStepReward': {\n return CompletedStepRewardAddressValidatorFactory(authorization.signers)\n }\n case 'derivedReceive': {\n return DerivedReceiveAddressValidatorFactory(authorization.signers, authorization.scope)\n }\n }\n}\n\n/**\n * Builds the `SignerValidator[]` consumed by `TransactionTransfersValidatorFactory` from a list\n * of authorizations. `SelfSignerValidator` is ALWAYS included so ordinary self-transfers pass;\n * an empty `authorizations` list therefore means \"self only\" \u2014 deny-all for reward/escrow families.\n */\nexport function signerValidatorsFromAuthorizations(authorizations: SignerAuthorization[] = []): SignerValidator[] {\n return [SelfSignerValidator, ...authorizations.map(signerValidatorFromAuthorization)]\n}\n", "import { isDefined, isUndefined } from '@ariestools/sdk'\nimport type { XyoAddress } from '@xyo-network/sdk'\n\nimport type {\n HydratedTransactionValidationFunction, StepIdentity,\n Transfer,\n} from '#protocol-lib'\nimport {\n derivedReceiveAddress,\n elevatedPayloads,\n HydratedTransactionValidationError,\n isTransfer,\n rewardAddressFromStepIdentity,\n} from '#protocol-lib'\n\n/** Function type that checks whether a signer is authorized to sign for a given signee address. */\nexport type SignerValidator = (signer: XyoAddress, signee: XyoAddress, context?: { address?: XyoAddress; scope?: string; step?: StepIdentity }) => boolean\n\n/** A signer validator that only allows an address to sign for itself. */\nexport const SelfSignerValidator: SignerValidator = (signer: XyoAddress, signee: XyoAddress) => signer === signee\n\n/** Creates a signer validator that authorizes specified signers to sign for completed step reward addresses. */\nexport const CompletedStepRewardAddressValidatorFactory = (allowedSigners: XyoAddress[]): SignerValidator => (\n signer: XyoAddress,\n signee: XyoAddress,\n context?: { step?: StepIdentity },\n) => {\n const step = context?.step\n if (isDefined(step)) {\n const contextAddress = rewardAddressFromStepIdentity(step)\n return allowedSigners.includes(signer) && signee === contextAddress\n }\n return false\n}\n\n/** Creates a signer validator that authorizes specified signers to sign for derived receive addresses within a given scope. */\nexport const DerivedReceiveAddressValidatorFactory = (allowedSigners: XyoAddress[], allowedScope: string): SignerValidator => (\n signer: XyoAddress,\n signee: XyoAddress,\n context?: { address?: XyoAddress; scope?: string },\n) => {\n const { address, scope } = context ?? {}\n if (scope !== allowedScope) {\n return false\n }\n if (isDefined(address)) {\n const derivedAddress = derivedReceiveAddress(address, scope)\n return allowedSigners.includes(signer) && signee === derivedAddress\n }\n return false\n}\n\n/**\n * Creates a transaction validator that checks all transfers are authorized by the transaction signer.\n *\n * Not part of `validateTransaction`'s built-in list \u2014 the signer validators come from deployment\n * config (`signerValidatorsFromAuthorizations`), so the engine must construct this validator and\n * inject it via `additionalValidators`. Skipping it disables transfer authorization entirely.\n */\nexport function TransactionTransfersValidatorFactory(\n signerValidators: SignerValidator[] = [SelfSignerValidator],\n): HydratedTransactionValidationFunction {\n return async (\n context,\n hydratedTx,\n ) => {\n const errors: HydratedTransactionValidationError[] = []\n const signer = hydratedTx[0].from\n try {\n const payloads = elevatedPayloads(hydratedTx)\n const transfers = payloads.filter(isTransfer) as Transfer[]\n for (const transfer of transfers) {\n if (isUndefined(signerValidators.find(v => v(signer, transfer.from, transfer.context)))) {\n errors.push(new HydratedTransactionValidationError(\n hydratedTx[0]._hash,\n hydratedTx,\n `transfer from address ${transfer.from} is not authorized by signer ${signer}`,\n ))\n }\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(hydratedTx[0]._hash, hydratedTx, 'validation excepted', ex))\n }\n return await Promise.resolve(errors)\n }\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { BoundWitnessValidator } from '@xyo-network/sdk'\n\nimport type { HydratedTransactionValidationFunction, HydratedTransactionWithHashMeta } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\nconst error = (tx: HydratedTransactionWithHashMeta, message: string): HydratedTransactionValidationError =>\n new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, message)\n\n// Friendly pre-check for the wallet bug we want to surface clearly: signatures\n// emitted under `signatures` instead of `$signatures`. The downstream\n// BoundWitnessValidator would also catch the missing/mismatched signatures,\n// but its message (\"Length mismatch: address/signature\", \"Missing signature\n// [<address>]\") doesn't hint at the actual root cause.\nconst checkSignaturesShape = (tx: HydratedTransactionWithHashMeta): HydratedTransactionValidationError[] => {\n const bw = tx[0] as unknown as Record<string, unknown>\n if (bw.$signatures === undefined) {\n return Array.isArray(bw.signatures)\n ? [error(tx, 'BoundWitness has `signatures` but expected `$signatures` (signatures must be in the meta-prefixed `$signatures` key)')]\n : [error(tx, 'BoundWitness is missing `$signatures`')]\n }\n return []\n}\n\n/**\n * Validates the transaction's BoundWitness wholistically by delegating to\n * `BoundWitnessValidator.validate()`. This covers:\n * - signatures: length matches addresses, every signature is cryptographically\n * valid for its corresponding address against the BW data hash\n * - addresses: uniqueness\n * - array length parity: payload_hashes vs payload_schemas\n * - schemas: per-schema name validators\n * - top-level schema check\n * - PayloadValidator.schemaName check\n *\n * Also emits a friendly diagnostic when the common wallet bug of\n * `signatures` vs `$signatures` is detected, so the failure points at the\n * actual root cause instead of buried length/missing-signature errors.\n */\nexport const TransactionBoundWitnessValidator: HydratedTransactionValidationFunction = async (\n context,\n tx,\n) => {\n try {\n const shapeErrors = checkSignaturesShape(tx)\n if (shapeErrors.length > 0) return shapeErrors\n const bwValidator = new BoundWitnessValidator(tx[0])\n const bwErrors = await bwValidator.validate()\n return bwErrors.map(e => error(tx, `BoundWitness validation: ${e.message}`))\n } catch (ex) {\n return [error(tx, `Failed TransactionBoundWitnessValidator: ${String(ex)}`)]\n }\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that transaction timing fields (nbf and exp) are positive, correctly ordered, and within allowed duration limits. */\nexport const TransactionDurationValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n// eslint-disable-next-line complexity\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n const { exp, nbf } = tx[0]\n if (nbf < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction nbf must be positive'))\n\n if (exp < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction exp must be positive'))\n if (exp <= nbf) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Transaction exp must greater than nbf'))\n if (exp - nbf > 10_000) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction exp must not be too far in the future',\n ))\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionDurationValidator: ${String(ex)}`,\n ex,\n ))\n }\n\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { extractElevatedHashes, HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that a hydrated transaction includes all required elevated script hashes. */\nexport const TransactionElevationValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n try {\n extractElevatedHashes(tx)\n } catch {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'Hydrated transaction does not include all script hashes'))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionElevationValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { addressesContains, asXyoAddress } from '@xyo-network/sdk'\n\nimport type { HydratedTransactionValidationFunction } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that the transaction's from field is a valid address and is included in the BoundWitness addresses. */\nexport const TransactionFromValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n const from = asXyoAddress(tx[0].from)\n if (from === undefined)errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction from is not a valid address',\n ))\n else if (!addressesContains(tx[0], from)) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Transaction from address must be listed in addresses',\n ))\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionFromValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n", "import { hexToBigInt, ZERO_HASH } from '@ariestools/sdk'\n\nimport type {\n HydratedTransactionValidationFunction,\n TransactionFeesBigInt, TransactionFeesHex,\n} from '#protocol-lib'\nimport {\n AttoXL1,\n HydratedTransactionValidationError,\n minTransactionFees,\n} from '#protocol-lib'\n\n/** Validates that transaction fee fields (base, gasLimit, gasPrice, priority) are present and meet minimum requirements. */\nexport const TransactionGasValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n// eslint-disable-next-line complexity\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (tx?.[0].fees === undefined) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'Missing fees',\n ))\n } else {\n const {\n base, gasLimit, gasPrice, priority,\n } = parseFees(tx[0].fees)\n\n if (base === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.base must be defined and a valid number',\n ))\n else if (base < minTransactionFees.base) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.base must be >= ${minTransactionFees.base}`,\n ))\n\n if (gasLimit === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.gasLimit must be defined and a valid number',\n ))\n else if (gasLimit < minTransactionFees.gasLimit) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.gasLimit must be >= ${minTransactionFees.gasLimit}`,\n ))\n\n if (gasPrice === undefined) errors.push(\n new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.gasPrice must be defined and a valid number',\n ),\n )\n else if (gasPrice < minTransactionFees.gasPrice) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.gasPrice must be >= ${minTransactionFees.gasPrice}`,\n ))\n\n if (priority === undefined) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n 'fees.priority must be defined and a valid number',\n ))\n else if (priority < minTransactionFees.priority) errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `fees.priority must be >= ${minTransactionFees.priority}`,\n ))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `Failed TransactionGasValidator: ${String(ex)}`,\n ex,\n ))\n }\n return errors\n}\n\nconst parseFees = (fees: TransactionFeesHex): Partial<TransactionFeesBigInt> => {\n const ret: Partial<TransactionFeesBigInt> = {}\n const {\n base, gasLimit, gasPrice, priority,\n } = fees\n if (base !== undefined) ret.base = AttoXL1(hexToBigInt(base))\n if (gasLimit !== undefined) ret.gasLimit = AttoXL1(hexToBigInt(gasLimit))\n if (gasPrice !== undefined) ret.gasPrice = AttoXL1(hexToBigInt(gasPrice))\n if (priority !== undefined) ret.priority = AttoXL1(hexToBigInt(priority))\n return ret\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport type { ValidateFunction } from 'ajv'\nimport { Ajv } from 'ajv'\n\nimport type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\nimport { TransactionBoundWitnessJsonSchema } from '#schema'\n\nconst ajv = new Ajv({ allErrors: true, strict: true })\n\nlet validate: ValidateFunction<TransactionBoundWitness> | undefined\n\n/** Validates a transaction against the TransactionBoundWitness JSON schema using AJV. */\nexport const TransactionJsonSchemaValidator: HydratedTransactionValidationFunction = (\n context,\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n validate ??= ajv.compile(TransactionBoundWitnessJsonSchema)\n if (!validate(PayloadBuilder.omitStorageMeta(tx[0]))) {\n const error = new HydratedTransactionValidationError(\n tx?.[0]?._hash ?? ZERO_HASH,\n tx,\n `failed JSON schema validation: ${ajv.errorsText(validate.errors, { separator: '\\n' })}`,\n validate.errors,\n )\n errors.push(error)\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))\n }\n return errors\n}\n", "import { ZERO_HASH } from '@ariestools/sdk'\n\nimport type {\n ChainId,\n HydratedTransactionValidationFunction,\n} from '#protocol-lib'\nimport { HydratedTransactionValidationError } from '#protocol-lib'\n\n/** Validates that the transaction's chain ID matches the expected chain ID from the validation context. */\nexport const TransactionProtocolValidator: HydratedTransactionValidationFunction = async (\n context: { chainId?: ChainId },\n tx,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (context?.chainId !== undefined && tx[0].chain !== context.chainId) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, `invalid chain id [${context.chainId}, ${tx[0].chain}]`))\n }\n } catch (ex) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'validation excepted', ex))\n }\n return await Promise.resolve(errors)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ZERO_HASH", "error", "ZERO_HASH", "ZERO_HASH", "HydratedTransactionValidationError", "ZERO_HASH", "BoundWitnessValidator", "HydratedTransactionValidationError", "ZERO_HASH", "HydratedTransactionValidationError", "ZERO_HASH", "HydratedTransactionValidationError", "ZERO_HASH", "HydratedTransactionValidationError", "hexToBigInt", "ZERO_HASH", "HydratedTransactionValidationError", "ZERO_HASH", "HydratedTransactionValidationError", "error", "ZERO_HASH", "HydratedTransactionValidationError", "HydratedTransactionValidationError", "ZERO_HASH"]
|
|
7
7
|
}
|