@xyo-network/xl1-validation 1.7.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +250 -0
  3. package/dist/neutral/boundwitness/index.d.ts +2 -0
  4. package/dist/neutral/boundwitness/index.d.ts.map +1 -0
  5. package/dist/neutral/boundwitness/validators/BoundWitnessReferences.d.ts +5 -0
  6. package/dist/neutral/boundwitness/validators/BoundWitnessReferences.d.ts.map +1 -0
  7. package/dist/neutral/boundwitness/validators/BoundWitnessSignatures.d.ts +3 -0
  8. package/dist/neutral/boundwitness/validators/BoundWitnessSignatures.d.ts.map +1 -0
  9. package/dist/neutral/boundwitness/validators/index.d.ts +3 -0
  10. package/dist/neutral/boundwitness/validators/index.d.ts.map +1 -0
  11. package/dist/neutral/index.d.ts +3 -0
  12. package/dist/neutral/index.d.ts.map +1 -0
  13. package/dist/neutral/index.mjs +258 -0
  14. package/dist/neutral/index.mjs.map +1 -0
  15. package/dist/neutral/transaction/index.d.ts +3 -0
  16. package/dist/neutral/transaction/index.d.ts.map +1 -0
  17. package/dist/neutral/transaction/validateTransaction.d.ts +4 -0
  18. package/dist/neutral/transaction/validateTransaction.d.ts.map +1 -0
  19. package/dist/neutral/transaction/validators/TransactionDurationValidator.d.ts +3 -0
  20. package/dist/neutral/transaction/validators/TransactionDurationValidator.d.ts.map +1 -0
  21. package/dist/neutral/transaction/validators/TransactionElevationValidator.d.ts +3 -0
  22. package/dist/neutral/transaction/validators/TransactionElevationValidator.d.ts.map +1 -0
  23. package/dist/neutral/transaction/validators/TransactionFromValidator.d.ts +3 -0
  24. package/dist/neutral/transaction/validators/TransactionFromValidator.d.ts.map +1 -0
  25. package/dist/neutral/transaction/validators/TransactionGasValidator.d.ts +3 -0
  26. package/dist/neutral/transaction/validators/TransactionGasValidator.d.ts.map +1 -0
  27. package/dist/neutral/transaction/validators/TransactionJsonSchemaValidator.d.ts +3 -0
  28. package/dist/neutral/transaction/validators/TransactionJsonSchemaValidator.d.ts.map +1 -0
  29. package/dist/neutral/transaction/validators/TransactionProtocolValidator.d.ts +3 -0
  30. package/dist/neutral/transaction/validators/TransactionProtocolValidator.d.ts.map +1 -0
  31. package/dist/neutral/transaction/validators/index.d.ts +7 -0
  32. package/dist/neutral/transaction/validators/index.d.ts.map +1 -0
  33. package/dist/neutral/transaction/validators/spec/TransactionDurationValidator.spec.d.ts +2 -0
  34. package/dist/neutral/transaction/validators/spec/TransactionDurationValidator.spec.d.ts.map +1 -0
  35. package/dist/neutral/transaction/validators/spec/TransactionElevationValidator.spec.d.ts +2 -0
  36. package/dist/neutral/transaction/validators/spec/TransactionElevationValidator.spec.d.ts.map +1 -0
  37. package/dist/neutral/transaction/validators/spec/TransactionFromValidator.spec.d.ts +2 -0
  38. package/dist/neutral/transaction/validators/spec/TransactionFromValidator.spec.d.ts.map +1 -0
  39. package/dist/neutral/transaction/validators/spec/TransactionGasValidator.spec.d.ts +2 -0
  40. package/dist/neutral/transaction/validators/spec/TransactionGasValidator.spec.d.ts.map +1 -0
  41. package/dist/neutral/transaction/validators/spec/TransactionJsonSchemaValidator.spec.d.ts +2 -0
  42. package/dist/neutral/transaction/validators/spec/TransactionJsonSchemaValidator.spec.d.ts.map +1 -0
  43. package/package.json +75 -0
  44. package/src/boundwitness/index.ts +1 -0
  45. package/src/boundwitness/validators/BoundWitnessReferences.ts +57 -0
  46. package/src/boundwitness/validators/BoundWitnessSignatures.ts +28 -0
  47. package/src/boundwitness/validators/index.ts +2 -0
  48. package/src/index.ts +2 -0
  49. package/src/transaction/index.ts +2 -0
  50. package/src/transaction/validateTransaction.ts +33 -0
  51. package/src/transaction/validators/TransactionDurationValidator.ts +33 -0
  52. package/src/transaction/validators/TransactionElevationValidator.ts +27 -0
  53. package/src/transaction/validators/TransactionFromValidator.ts +33 -0
  54. package/src/transaction/validators/TransactionGasValidator.ts +97 -0
  55. package/src/transaction/validators/TransactionJsonSchemaValidator.ts +34 -0
  56. package/src/transaction/validators/TransactionProtocolValidator.ts +20 -0
  57. package/src/transaction/validators/index.ts +6 -0
  58. package/src/transaction/validators/spec/TransactionDurationValidator.spec.ts +49 -0
  59. package/src/transaction/validators/spec/TransactionElevationValidator.spec.ts +39 -0
  60. package/src/transaction/validators/spec/TransactionFromValidator.spec.ts +43 -0
  61. package/src/transaction/validators/spec/TransactionGasValidator.spec.ts +88 -0
  62. package/src/transaction/validators/spec/TransactionJsonSchemaValidator.spec.ts +33 -0
@@ -0,0 +1,258 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/boundwitness/validators/BoundWitnessReferences.ts
5
+ import { ZERO_HASH } from "@xylabs/hex";
6
+ import { isAnyPayload } from "@xyo-network/payload-model";
7
+ import { HydratedBoundWitnessValidationError } from "@xyo-network/xl1-protocol";
8
+ function getPayloadsFromPayloadArray(payloads, hashes) {
9
+ return hashes.map((hash) => payloads.find((payload) => payload._hash === hash || payload._dataHash === hash));
10
+ }
11
+ __name(getPayloadsFromPayloadArray, "getPayloadsFromPayloadArray");
12
+ var BoundWitnessReferencesValidator = /* @__PURE__ */ __name((allowedSchemas) => ([bw, payloadSet]) => {
13
+ const errors = [];
14
+ try {
15
+ const payloads = getPayloadsFromPayloadArray(payloadSet, bw.payload_hashes);
16
+ if (payloads.length !== bw.payload_hashes.length) {
17
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
18
+ bw,
19
+ payloadSet
20
+ ], "unable to locate payloads"));
21
+ }
22
+ for (let payload of payloads) {
23
+ if (isAnyPayload(payload)) {
24
+ const payloadHashIndex = bw.payload_hashes.indexOf(payload._hash);
25
+ const payloadDataHashIndex = bw.payload_hashes.indexOf(payload._dataHash);
26
+ const payloadIndex = Math.max(payloadHashIndex, payloadDataHashIndex);
27
+ if (payloadIndex === -1) {
28
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
29
+ bw,
30
+ payloadSet
31
+ ], "payload hash not found"));
32
+ }
33
+ const declaredSchema = bw.payload_schemas[payloadIndex];
34
+ if (declaredSchema !== payload.schema) {
35
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
36
+ bw,
37
+ payloadSet
38
+ ], "mismatched schema"));
39
+ }
40
+ if (allowedSchemas && !allowedSchemas.includes(payload.schema)) {
41
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
42
+ bw,
43
+ payloadSet
44
+ ], `disallowed schema [${payload.schema}]`));
45
+ }
46
+ } else {
47
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
48
+ bw,
49
+ payloadSet
50
+ ], "invalid payload"));
51
+ }
52
+ }
53
+ } catch (ex) {
54
+ const error = new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [
55
+ bw,
56
+ payloadSet
57
+ ], `validation excepted: ${ex}`);
58
+ error.cause = ex;
59
+ errors.push(error);
60
+ }
61
+ return errors;
62
+ }, "BoundWitnessReferencesValidator");
63
+
64
+ // src/boundwitness/validators/BoundWitnessSignatures.ts
65
+ import { toArrayBuffer } from "@xylabs/arraybuffer";
66
+ import { ZERO_HASH as ZERO_HASH2 } from "@xylabs/hex";
67
+ import { BoundWitnessBuilder } from "@xyo-network/boundwitness-builder";
68
+ import { BoundWitnessValidator } from "@xyo-network/boundwitness-validator";
69
+ import { BoundWitnessValidationError } from "@xyo-network/xl1-protocol";
70
+ var BoundWitnessSignaturesValidator = /* @__PURE__ */ __name(async (bw) => {
71
+ const errors = [];
72
+ try {
73
+ const dataHash = await BoundWitnessBuilder.dataHash(bw);
74
+ const results = await Promise.all(bw.addresses.map(async (address, index) => {
75
+ return [
76
+ address,
77
+ await BoundWitnessValidator.validateSignature(toArrayBuffer(dataHash), toArrayBuffer(address), toArrayBuffer(bw.$signatures[index]))
78
+ ];
79
+ }));
80
+ for (const [, bwErrors] of results) {
81
+ for (const bwError of bwErrors) {
82
+ errors.push(new BoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, bw, "validation errors", bwError));
83
+ }
84
+ }
85
+ } catch (ex) {
86
+ errors.push(new BoundWitnessValidationError(bw?._hash ?? ZERO_HASH2, bw, "validation excepted", ex));
87
+ }
88
+ return errors;
89
+ }, "BoundWitnessSignaturesValidator");
90
+
91
+ // src/transaction/validateTransaction.ts
92
+ import { isTransactionBoundWitness } from "@xyo-network/xl1-protocol";
93
+
94
+ // src/transaction/validators/TransactionDurationValidator.ts
95
+ import { ZERO_HASH as ZERO_HASH3 } from "@xylabs/hex";
96
+ import { HydratedTransactionValidationError } from "@xyo-network/xl1-protocol";
97
+ var TransactionDurationValidator = /* @__PURE__ */ __name((tx) => {
98
+ const errors = [];
99
+ try {
100
+ const { exp, nbf } = tx[0];
101
+ if (nbf < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH3, tx, "Transaction nbf must be positive"));
102
+ if (exp < 0) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH3, tx, "Transaction exp must be positive"));
103
+ if (exp <= nbf) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH3, tx, "Transaction exp must greater than nbf"));
104
+ if (exp - nbf > 1e4) errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH3, tx, "Transaction exp must not be too far in the future"));
105
+ } catch (ex) {
106
+ errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH3, tx, `Failed TransactionDurationValidator: ${ex}`, ex));
107
+ }
108
+ return errors;
109
+ }, "TransactionDurationValidator");
110
+
111
+ // src/transaction/validators/TransactionElevationValidator.ts
112
+ import { ZERO_HASH as ZERO_HASH4 } from "@xylabs/hex";
113
+ import { HydratedTransactionValidationError as HydratedTransactionValidationError2 } from "@xyo-network/xl1-protocol";
114
+ import { extractElevatedHashes } from "@xyo-network/xl1-protocol-sdk";
115
+ var TransactionElevationValidator = /* @__PURE__ */ __name((tx) => {
116
+ const errors = [];
117
+ try {
118
+ try {
119
+ extractElevatedHashes(tx);
120
+ } catch {
121
+ errors.push(new HydratedTransactionValidationError2(tx?.[0]?._hash ?? ZERO_HASH4, tx, "Hydrated transaction does not include all script hashes"));
122
+ }
123
+ } catch (ex) {
124
+ errors.push(new HydratedTransactionValidationError2(tx?.[0]?._hash ?? ZERO_HASH4, tx, `Failed TransactionElevationValidator: ${ex}`, ex));
125
+ }
126
+ return errors;
127
+ }, "TransactionElevationValidator");
128
+
129
+ // src/transaction/validators/TransactionFromValidator.ts
130
+ import { asAddress, ZERO_HASH as ZERO_HASH5 } from "@xylabs/hex";
131
+ import { addressesContains } from "@xyo-network/boundwitness-validator";
132
+ import { HydratedTransactionValidationError as HydratedTransactionValidationError3 } from "@xyo-network/xl1-protocol";
133
+ var TransactionFromValidator = /* @__PURE__ */ __name((tx) => {
134
+ const errors = [];
135
+ try {
136
+ const from = asAddress(tx[0].from);
137
+ if (from === void 0) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, "Transaction from is not a valid address"));
138
+ else if (!addressesContains(tx[0], from)) errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, "Transaction from address must be listed in addresses"));
139
+ } catch (ex) {
140
+ errors.push(new HydratedTransactionValidationError3(tx?.[0]?._hash ?? ZERO_HASH5, tx, `Failed TransactionFromValidator: ${ex}`, ex));
141
+ }
142
+ return errors;
143
+ }, "TransactionFromValidator");
144
+
145
+ // src/transaction/validators/TransactionGasValidator.ts
146
+ import { hexToBigInt, ZERO_HASH as ZERO_HASH6 } from "@xylabs/hex";
147
+ import { AttoXL1, HydratedTransactionValidationError as HydratedTransactionValidationError4, minTransactionFees } from "@xyo-network/xl1-protocol";
148
+ var TransactionGasValidator = /* @__PURE__ */ __name((tx) => {
149
+ const errors = [];
150
+ try {
151
+ if (tx?.[0].fees === void 0) {
152
+ errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "Missing fees"));
153
+ } else {
154
+ const { base, gasLimit, gasPrice, priority } = parseFees(tx[0].fees);
155
+ if (base === void 0) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "fees.base must be defined and a valid number"));
156
+ else if (base < minTransactionFees.base) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, `fees.base must be >= ${minTransactionFees.base}`));
157
+ if (gasLimit === void 0) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "fees.gasLimit must be defined and a valid number"));
158
+ else if (gasLimit < minTransactionFees.gasLimit) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, `fees.gasLimit must be >= ${minTransactionFees.gasLimit}`));
159
+ if (gasPrice === void 0) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "fees.gasPrice must be defined and a valid number"));
160
+ else if (gasPrice < minTransactionFees.gasPrice) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, `fees.gasPrice must be >= ${minTransactionFees.gasPrice}`));
161
+ if (priority === void 0) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, "fees.priority must be defined and a valid number"));
162
+ else if (priority < minTransactionFees.priority) errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, `fees.priority must be >= ${minTransactionFees.priority}`));
163
+ }
164
+ } catch (ex) {
165
+ errors.push(new HydratedTransactionValidationError4(tx?.[0]?._hash ?? ZERO_HASH6, tx, `Failed TransactionGasValidator: ${ex}`, ex));
166
+ }
167
+ return errors;
168
+ }, "TransactionGasValidator");
169
+ var parseFees = /* @__PURE__ */ __name((fees) => {
170
+ const ret = {};
171
+ const { base, gasLimit, gasPrice, priority } = fees;
172
+ if (base !== void 0) ret.base = AttoXL1(hexToBigInt(base));
173
+ if (gasLimit !== void 0) ret.gasLimit = AttoXL1(hexToBigInt(gasLimit));
174
+ if (gasPrice !== void 0) ret.gasPrice = AttoXL1(hexToBigInt(gasPrice));
175
+ if (priority !== void 0) ret.priority = AttoXL1(hexToBigInt(priority));
176
+ return ret;
177
+ }, "parseFees");
178
+
179
+ // src/transaction/validators/TransactionJsonSchemaValidator.ts
180
+ import { ZERO_HASH as ZERO_HASH7 } from "@xylabs/hex";
181
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
182
+ import { HydratedTransactionValidationError as HydratedTransactionValidationError5 } from "@xyo-network/xl1-protocol";
183
+ import { TransactionBoundWitnessJsonSchema } from "@xyo-network/xl1-schema";
184
+ import { Ajv } from "ajv";
185
+ var ajv = new Ajv({
186
+ allErrors: true,
187
+ strict: true
188
+ });
189
+ var validate;
190
+ var TransactionJsonSchemaValidator = /* @__PURE__ */ __name((tx) => {
191
+ const errors = [];
192
+ try {
193
+ if (validate === void 0) validate = ajv.compile(TransactionBoundWitnessJsonSchema);
194
+ if (!validate(PayloadBuilder.omitStorageMeta(tx[0]))) {
195
+ const error = new HydratedTransactionValidationError5(tx?.[0]?._hash ?? ZERO_HASH7, tx, `failed JSON schema validation: ${ajv.errorsText(validate.errors, {
196
+ separator: "\n"
197
+ })}`);
198
+ error.cause = validate.errors;
199
+ errors.push(error);
200
+ }
201
+ } catch (ex) {
202
+ errors.push(new HydratedTransactionValidationError5(tx?.[0]?._hash ?? ZERO_HASH7, tx, "validation excepted", ex));
203
+ }
204
+ return errors;
205
+ }, "TransactionJsonSchemaValidator");
206
+
207
+ // src/transaction/validators/TransactionProtocolValidator.ts
208
+ import { ZERO_HASH as ZERO_HASH8 } from "@xylabs/hex";
209
+ import { HydratedTransactionValidationError as HydratedTransactionValidationError6 } from "@xyo-network/xl1-protocol";
210
+ var TransactionProtocolValidator = /* @__PURE__ */ __name(async (tx, chainId) => {
211
+ const errors = [];
212
+ try {
213
+ if (chainId !== void 0 && tx[0].chain !== chainId) {
214
+ errors.push(new HydratedTransactionValidationError6(tx?.[0]?._hash ?? ZERO_HASH8, tx, "invalid chain id"));
215
+ }
216
+ } catch (ex) {
217
+ errors.push(new HydratedTransactionValidationError6(tx?.[0]?._hash ?? ZERO_HASH8, tx, "validation excepted", ex));
218
+ }
219
+ return await Promise.resolve(errors);
220
+ }, "TransactionProtocolValidator");
221
+
222
+ // src/transaction/validateTransaction.ts
223
+ async function validateTransaction(tx, chainId, additionalValidators = []) {
224
+ try {
225
+ if (!isTransactionBoundWitness(tx[0])) {
226
+ return [
227
+ new Error("failed isTransactionBoundWitness identity check")
228
+ ];
229
+ }
230
+ const validators = [
231
+ TransactionProtocolValidator,
232
+ TransactionJsonSchemaValidator,
233
+ TransactionDurationValidator,
234
+ TransactionFromValidator,
235
+ TransactionGasValidator,
236
+ TransactionElevationValidator,
237
+ ...additionalValidators
238
+ ];
239
+ return (await Promise.all(validators.map((v) => v(tx, chainId)))).flat();
240
+ } catch (ex) {
241
+ return [
242
+ new Error(`Failed TransactionGasValidator: ${ex}`)
243
+ ];
244
+ }
245
+ }
246
+ __name(validateTransaction, "validateTransaction");
247
+ export {
248
+ BoundWitnessReferencesValidator,
249
+ BoundWitnessSignaturesValidator,
250
+ TransactionDurationValidator,
251
+ TransactionElevationValidator,
252
+ TransactionFromValidator,
253
+ TransactionGasValidator,
254
+ TransactionJsonSchemaValidator,
255
+ TransactionProtocolValidator,
256
+ validateTransaction
257
+ };
258
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/boundwitness/validators/BoundWitnessReferences.ts","../../src/boundwitness/validators/BoundWitnessSignatures.ts","../../src/transaction/validateTransaction.ts","../../src/transaction/validators/TransactionDurationValidator.ts","../../src/transaction/validators/TransactionElevationValidator.ts","../../src/transaction/validators/TransactionFromValidator.ts","../../src/transaction/validators/TransactionGasValidator.ts","../../src/transaction/validators/TransactionJsonSchemaValidator.ts","../../src/transaction/validators/TransactionProtocolValidator.ts"],"sourcesContent":["import { type Hash, ZERO_HASH } from '@xylabs/hex'\nimport type { Promisable } from '@xylabs/promise'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport type {\n Payload,\n Schema,\n WithHashStorageMeta,\n} from '@xyo-network/payload-model'\nimport { isAnyPayload } from '@xyo-network/payload-model'\nimport type { HydratedBoundWitnessValidationFunction, HydratedBoundWitnessWithHashStorageMeta } from '@xyo-network/xl1-protocol'\nimport { HydratedBoundWitnessValidationError } from '@xyo-network/xl1-protocol'\n\nfunction getPayloadsFromPayloadArray(payloads: WithHashStorageMeta<Payload>[], hashes: Hash[]): (WithHashStorageMeta<Payload> | undefined)[] {\n return hashes.map(hash => payloads.find(payload => payload._hash === hash || payload._dataHash === hash))\n}\n\nexport const BoundWitnessReferencesValidator\n// eslint-disable-next-line complexity\n= <T extends BoundWitness = BoundWitness>(allowedSchemas?: Schema[]): HydratedBoundWitnessValidationFunction<T> => (\n [bw, payloadSet]: HydratedBoundWitnessWithHashStorageMeta<T>,\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 (let 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: ${ex}`)\n error.cause = ex\n errors.push(error)\n }\n return errors\n}\n","import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { type Address, ZERO_HASH } from '@xylabs/hex'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessValidator } from '@xyo-network/boundwitness-validator'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport type { BoundWitnessValidationFunction } from '@xyo-network/xl1-protocol'\nimport { BoundWitnessValidationError } from '@xyo-network/xl1-protocol'\n\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: [Address, Error[]][] = await Promise.all(bw.addresses.map(async (address, index) => {\n return [address, await BoundWitnessValidator.validateSignature(toArrayBuffer(dataHash), toArrayBuffer(address), toArrayBuffer(bw.$signatures[index]))]\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 type { Address } from '@xylabs/hex'\nimport type { HydratedTransaction, HydratedTransactionValidationFunction } from '@xyo-network/xl1-protocol'\nimport { isTransactionBoundWitness } from '@xyo-network/xl1-protocol'\n\nimport {\n TransactionDurationValidator,\n TransactionElevationValidator, TransactionFromValidator, TransactionGasValidator, TransactionJsonSchemaValidator, TransactionProtocolValidator,\n} from './validators/index.ts'\n\nexport async function validateTransaction(\n tx: HydratedTransaction,\n chainId?: Address,\n additionalValidators: HydratedTransactionValidationFunction[] = [],\n) {\n try {\n if (!isTransactionBoundWitness(tx[0])) {\n return [new Error('failed isTransactionBoundWitness identity check')]\n }\n\n const validators: HydratedTransactionValidationFunction[] = [\n TransactionProtocolValidator,\n TransactionJsonSchemaValidator,\n TransactionDurationValidator,\n TransactionFromValidator,\n TransactionGasValidator,\n TransactionElevationValidator,\n ...additionalValidators,\n ]\n return (await Promise.all(validators.map(v => v(tx, chainId)))).flat()\n } catch (ex) {\n return [(new Error(`Failed TransactionGasValidator: ${ex}`))]\n }\n}\n","import { ZERO_HASH } from '@xylabs/hex'\nimport type {\n HydratedTransaction, HydratedTransactionValidationFunction, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'\n\n// eslint-disable-next-line complexity\nexport const TransactionDurationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (\n tx: HydratedTransaction,\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: ${ex}`,\n ex,\n ))\n }\n\n return errors\n}\n","import { ZERO_HASH } from '@xylabs/hex'\nimport type {\n HydratedTransaction, HydratedTransactionValidationFunction, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'\nimport { extractElevatedHashes } from '@xyo-network/xl1-protocol-sdk'\n\nexport const TransactionElevationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (\n tx: HydratedTransaction,\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: ${ex}`,\n ex,\n ))\n }\n return errors\n}\n","import { asAddress, ZERO_HASH } from '@xylabs/hex'\nimport { addressesContains } from '@xyo-network/boundwitness-validator'\nimport type {\n HydratedTransaction, HydratedTransactionValidationFunction, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'\n\nexport const TransactionFromValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (\n tx: HydratedTransaction,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n const from = asAddress(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: ${ex}`,\n ex,\n ))\n }\n return errors\n}\n","import { hexToBigInt, ZERO_HASH } from '@xylabs/hex'\nimport type {\n HydratedTransaction,\n HydratedTransactionValidationFunction,\n TransactionBoundWitness, TransactionFeesBigInt, TransactionFeesHex,\n} from '@xyo-network/xl1-protocol'\nimport {\n AttoXL1,\n HydratedTransactionValidationError,\n minTransactionFees,\n} from '@xyo-network/xl1-protocol'\n\n// eslint-disable-next-line complexity\nexport const TransactionGasValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (\n tx: HydratedTransaction,\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: ${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 '@xylabs/hex'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n HydratedTransaction, HydratedTransactionValidationFunction, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'\nimport { TransactionBoundWitnessJsonSchema } from '@xyo-network/xl1-schema'\nimport type { ValidateFunction } from 'ajv'\nimport { Ajv } from 'ajv'\n\nconst ajv = new Ajv({ allErrors: true, strict: true })\n\nlet validate: ValidateFunction<TransactionBoundWitness> | undefined\n\nexport const TransactionJsonSchemaValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = (\n tx: HydratedTransaction,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (validate === undefined) 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 )\n error.cause = validate.errors\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 { type Address, ZERO_HASH } from '@xylabs/hex'\nimport type {\n HydratedTransaction, HydratedTransactionValidationFunction, TransactionBoundWitness,\n} from '@xyo-network/xl1-protocol'\nimport { HydratedTransactionValidationError } from '@xyo-network/xl1-protocol'\n\nexport const TransactionProtocolValidator: HydratedTransactionValidationFunction<TransactionBoundWitness> = async (\n tx: HydratedTransaction,\n chainId?: Address,\n) => {\n const errors: HydratedTransactionValidationError[] = []\n try {\n if (chainId !== undefined && tx[0].chain !== chainId) {\n errors.push(new HydratedTransactionValidationError(tx?.[0]?._hash ?? ZERO_HASH, tx, 'invalid chain id'))\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"],"mappings":"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","names":["ZERO_HASH","isAnyPayload","HydratedBoundWitnessValidationError","getPayloadsFromPayloadArray","payloads","hashes","map","hash","find","payload","_hash","_dataHash","BoundWitnessReferencesValidator","allowedSchemas","bw","payloadSet","errors","payload_hashes","length","push","HydratedBoundWitnessValidationError","ZERO_HASH","isAnyPayload","payloadHashIndex","indexOf","payloadDataHashIndex","payloadIndex","Math","max","declaredSchema","payload_schemas","schema","includes","ex","error","cause","toArrayBuffer","ZERO_HASH","BoundWitnessBuilder","BoundWitnessValidator","BoundWitnessValidationError","BoundWitnessSignaturesValidator","bw","errors","dataHash","BoundWitnessBuilder","results","Promise","all","addresses","map","address","index","BoundWitnessValidator","validateSignature","toArrayBuffer","$signatures","bwErrors","bwError","push","BoundWitnessValidationError","_hash","ZERO_HASH","ex","isTransactionBoundWitness","ZERO_HASH","HydratedTransactionValidationError","TransactionDurationValidator","tx","errors","exp","nbf","push","HydratedTransactionValidationError","_hash","ZERO_HASH","ex","ZERO_HASH","HydratedTransactionValidationError","extractElevatedHashes","TransactionElevationValidator","tx","errors","extractElevatedHashes","push","HydratedTransactionValidationError","_hash","ZERO_HASH","ex","asAddress","ZERO_HASH","addressesContains","HydratedTransactionValidationError","TransactionFromValidator","tx","errors","from","asAddress","undefined","push","HydratedTransactionValidationError","_hash","ZERO_HASH","addressesContains","ex","hexToBigInt","ZERO_HASH","AttoXL1","HydratedTransactionValidationError","minTransactionFees","TransactionGasValidator","tx","errors","fees","undefined","push","HydratedTransactionValidationError","_hash","ZERO_HASH","base","gasLimit","gasPrice","priority","parseFees","minTransactionFees","ex","ret","AttoXL1","hexToBigInt","ZERO_HASH","PayloadBuilder","HydratedTransactionValidationError","TransactionBoundWitnessJsonSchema","Ajv","ajv","Ajv","allErrors","strict","validate","TransactionJsonSchemaValidator","tx","errors","undefined","compile","TransactionBoundWitnessJsonSchema","PayloadBuilder","omitStorageMeta","error","HydratedTransactionValidationError","_hash","ZERO_HASH","errorsText","separator","cause","push","ex","ZERO_HASH","HydratedTransactionValidationError","TransactionProtocolValidator","tx","chainId","errors","undefined","chain","push","HydratedTransactionValidationError","_hash","ZERO_HASH","ex","Promise","resolve","validateTransaction","tx","chainId","additionalValidators","isTransactionBoundWitness","Error","validators","TransactionProtocolValidator","TransactionJsonSchemaValidator","TransactionDurationValidator","TransactionFromValidator","TransactionGasValidator","TransactionElevationValidator","Promise","all","map","v","flat","ex"]}
@@ -0,0 +1,3 @@
1
+ export * from './validateTransaction.ts';
2
+ export * from './validators/index.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transaction/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Address } from '@xylabs/hex';
2
+ import type { HydratedTransaction, HydratedTransactionValidationFunction } from '@xyo-network/xl1-protocol';
3
+ export declare function validateTransaction(tx: HydratedTransaction, chainId?: Address, additionalValidators?: HydratedTransactionValidationFunction[]): Promise<Error[]>;
4
+ //# sourceMappingURL=validateTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateTransaction.d.ts","sourceRoot":"","sources":["../../../src/transaction/validateTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,qCAAqC,EAAE,MAAM,2BAA2B,CAAA;AAQ3G,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,mBAAmB,EACvB,OAAO,CAAC,EAAE,OAAO,EACjB,oBAAoB,GAAE,qCAAqC,EAAO,oBAoBnE"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionDurationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionDurationValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionDurationValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionDurationValidator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACW,qCAAqC,EAAE,uBAAuB,EACpF,MAAM,2BAA2B,CAAA;AAIlC,eAAO,MAAM,4BAA4B,EAAE,qCAAqC,CAAC,uBAAuB,CAyBvG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionElevationValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionElevationValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionElevationValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionElevationValidator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACW,qCAAqC,EAAE,uBAAuB,EACpF,MAAM,2BAA2B,CAAA;AAIlC,eAAO,MAAM,6BAA6B,EAAE,qCAAqC,CAAC,uBAAuB,CAmBxG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionFromValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionFromValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionFromValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionFromValidator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACW,qCAAqC,EAAE,uBAAuB,EACpF,MAAM,2BAA2B,CAAA;AAGlC,eAAO,MAAM,wBAAwB,EAAE,qCAAqC,CAAC,uBAAuB,CAyBnG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionGasValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionGasValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionGasValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionGasValidator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,qCAAqC,EACrC,uBAAuB,EACxB,MAAM,2BAA2B,CAAA;AAQlC,eAAO,MAAM,uBAAuB,EAAE,qCAAqC,CAAC,uBAAuB,CAuElG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionJsonSchemaValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionJsonSchemaValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionJsonSchemaValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionJsonSchemaValidator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACW,qCAAqC,EAAE,uBAAuB,EACpF,MAAM,2BAA2B,CAAA;AAUlC,eAAO,MAAM,8BAA8B,EAAE,qCAAqC,CAAC,uBAAuB,CAmBzG,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { HydratedTransactionValidationFunction, TransactionBoundWitness } from '@xyo-network/xl1-protocol';
2
+ export declare const TransactionProtocolValidator: HydratedTransactionValidationFunction<TransactionBoundWitness>;
3
+ //# sourceMappingURL=TransactionProtocolValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionProtocolValidator.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/TransactionProtocolValidator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACW,qCAAqC,EAAE,uBAAuB,EACpF,MAAM,2BAA2B,CAAA;AAGlC,eAAO,MAAM,4BAA4B,EAAE,qCAAqC,CAAC,uBAAuB,CAavG,CAAA"}
@@ -0,0 +1,7 @@
1
+ export * from './TransactionDurationValidator.ts';
2
+ export * from './TransactionElevationValidator.ts';
3
+ export * from './TransactionFromValidator.ts';
4
+ export * from './TransactionGasValidator.ts';
5
+ export * from './TransactionJsonSchemaValidator.ts';
6
+ export * from './TransactionProtocolValidator.ts';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/transaction/validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAA;AACjD,cAAc,oCAAoC,CAAA;AAClD,cAAc,+BAA+B,CAAA;AAC7C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,qCAAqC,CAAA;AACnD,cAAc,mCAAmC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransactionDurationValidator.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionDurationValidator.spec.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/validators/spec/TransactionDurationValidator.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransactionElevationValidator.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionElevationValidator.spec.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/validators/spec/TransactionElevationValidator.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransactionFromValidator.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionFromValidator.spec.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/validators/spec/TransactionFromValidator.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransactionGasValidator.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionGasValidator.spec.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/validators/spec/TransactionGasValidator.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TransactionJsonSchemaValidator.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionJsonSchemaValidator.spec.d.ts","sourceRoot":"","sources":["../../../../../src/transaction/validators/spec/TransactionJsonSchemaValidator.spec.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "$schema": "http://json.schemastore.org/package.json",
3
+ "name": "@xyo-network/xl1-validation",
4
+ "version": "1.7.16",
5
+ "description": "XYO Layer One SDK Validation",
6
+ "homepage": "https://xylabs.com",
7
+ "bugs": {
8
+ "url": "git+https://github.com/xylabs/xyo-chain/issues",
9
+ "email": "support@xylabs.com"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/xylabs/xyo-chain.git"
14
+ },
15
+ "license": "LGPL-3.0-only",
16
+ "author": {
17
+ "name": "XY Labs Development Team",
18
+ "email": "support@xylabs.com",
19
+ "url": "https://xylabs.com"
20
+ },
21
+ "sideEffects": false,
22
+ "type": "module",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/neutral/index.d.ts",
26
+ "source": "./src/index.ts",
27
+ "default": "./dist/neutral/index.mjs"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
31
+ "module": "./dist/neutral/index.mjs",
32
+ "source": "./src/index.ts",
33
+ "types": "./dist/neutral/index.d.ts",
34
+ "files": [
35
+ "dist",
36
+ "src"
37
+ ],
38
+ "dependencies": {
39
+ "@xylabs/arraybuffer": "^4.13.23",
40
+ "@xylabs/hex": "^4.13.23",
41
+ "@xyo-network/boundwitness-builder": "^4.1.7",
42
+ "@xyo-network/boundwitness-model": "^4.1.7",
43
+ "@xyo-network/boundwitness-validator": "^4.1.7",
44
+ "@xyo-network/payload-builder": "^4.1.7",
45
+ "@xyo-network/payload-model": "^4.1.7",
46
+ "@xyo-network/xl1-protocol": "^1.7.20",
47
+ "@xyo-network/xl1-protocol-sdk": "^1.7.16",
48
+ "@xyo-network/xl1-schema": "^1.7.16",
49
+ "ajv": "^8.17.1"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^24.1.0",
53
+ "@xylabs/assert": "^4.13.23",
54
+ "@xylabs/promise": "^4.13.23",
55
+ "@xylabs/ts-scripts-yarn3": "^7.0.1",
56
+ "@xylabs/tsconfig": "^7.0.1",
57
+ "@xyo-network/account": "^4.1.7",
58
+ "@xyo-network/account-model": "^4.1.7",
59
+ "@xyo-network/archivist-memory": "^4.1.7",
60
+ "@xyo-network/archivist-model": "^4.1.7",
61
+ "@xyo-network/chain-protocol": "^1.7.16",
62
+ "@xyo-network/wallet": "^4.1.7",
63
+ "@xyo-network/xl1-protocol-sdk": "^1.7.16",
64
+ "knip": "^5.62.0",
65
+ "typescript": "^5.8.3",
66
+ "vitest": "^3.2.4"
67
+ },
68
+ "engines": {
69
+ "node": ">=22.3 <23"
70
+ },
71
+ "engineStrict": true,
72
+ "publishConfig": {
73
+ "access": "public"
74
+ }
75
+ }
@@ -0,0 +1 @@
1
+ export * from './validators/index.ts'
@@ -0,0 +1,57 @@
1
+ import { type Hash, ZERO_HASH } from '@xylabs/hex'
2
+ import type { Promisable } from '@xylabs/promise'
3
+ import type { BoundWitness } from '@xyo-network/boundwitness-model'
4
+ import type {
5
+ Payload,
6
+ Schema,
7
+ WithHashStorageMeta,
8
+ } from '@xyo-network/payload-model'
9
+ import { isAnyPayload } from '@xyo-network/payload-model'
10
+ import type { HydratedBoundWitnessValidationFunction, HydratedBoundWitnessWithHashStorageMeta } from '@xyo-network/xl1-protocol'
11
+ import { HydratedBoundWitnessValidationError } from '@xyo-network/xl1-protocol'
12
+
13
+ function getPayloadsFromPayloadArray(payloads: WithHashStorageMeta<Payload>[], hashes: Hash[]): (WithHashStorageMeta<Payload> | undefined)[] {
14
+ return hashes.map(hash => payloads.find(payload => payload._hash === hash || payload._dataHash === hash))
15
+ }
16
+
17
+ export const BoundWitnessReferencesValidator
18
+ // eslint-disable-next-line complexity
19
+ = <T extends BoundWitness = BoundWitness>(allowedSchemas?: Schema[]): HydratedBoundWitnessValidationFunction<T> => (
20
+ [bw, payloadSet]: HydratedBoundWitnessWithHashStorageMeta<T>,
21
+ ): Promisable<HydratedBoundWitnessValidationError[]> => {
22
+ const errors: HydratedBoundWitnessValidationError[] = []
23
+ try {
24
+ const payloads = getPayloadsFromPayloadArray(payloadSet, bw.payload_hashes)
25
+ if (payloads.length !== bw.payload_hashes.length) {
26
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'unable to locate payloads'))
27
+ }
28
+
29
+ // check if payloads are valid and if their schemas match the declared schemas
30
+ for (let payload of payloads) {
31
+ if (isAnyPayload(payload)) {
32
+ const payloadHashIndex = bw.payload_hashes.indexOf(payload._hash)
33
+ const payloadDataHashIndex = bw.payload_hashes.indexOf(payload._dataHash)
34
+ const payloadIndex = Math.max(payloadHashIndex, payloadDataHashIndex)
35
+ if (payloadIndex === -1) {
36
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'payload hash not found'))
37
+ }
38
+
39
+ const declaredSchema = bw.payload_schemas[payloadIndex]
40
+ if (declaredSchema !== payload.schema) {
41
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'mismatched schema'))
42
+ }
43
+
44
+ if (allowedSchemas && !allowedSchemas.includes(payload.schema)) {
45
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `disallowed schema [${payload.schema}]`))
46
+ }
47
+ } else {
48
+ errors.push(new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], 'invalid payload'))
49
+ }
50
+ }
51
+ } catch (ex) {
52
+ const error = new HydratedBoundWitnessValidationError(bw?._hash ?? ZERO_HASH, [bw, payloadSet], `validation excepted: ${ex}`)
53
+ error.cause = ex
54
+ errors.push(error)
55
+ }
56
+ return errors
57
+ }
@@ -0,0 +1,28 @@
1
+ import { toArrayBuffer } from '@xylabs/arraybuffer'
2
+ import { type Address, ZERO_HASH } from '@xylabs/hex'
3
+ import { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'
4
+ import type { BoundWitness } from '@xyo-network/boundwitness-model'
5
+ import { BoundWitnessValidator } from '@xyo-network/boundwitness-validator'
6
+ import type { WithStorageMeta } from '@xyo-network/payload-model'
7
+ import type { BoundWitnessValidationFunction } from '@xyo-network/xl1-protocol'
8
+ import { BoundWitnessValidationError } from '@xyo-network/xl1-protocol'
9
+
10
+ export const BoundWitnessSignaturesValidator: BoundWitnessValidationFunction = async (
11
+ bw: BoundWitness,
12
+ ) => {
13
+ const errors: BoundWitnessValidationError[] = []
14
+ try {
15
+ const dataHash = await BoundWitnessBuilder.dataHash(bw)
16
+ const results: [Address, Error[]][] = await Promise.all(bw.addresses.map(async (address, index) => {
17
+ return [address, await BoundWitnessValidator.validateSignature(toArrayBuffer(dataHash), toArrayBuffer(address), toArrayBuffer(bw.$signatures[index]))]
18
+ }))
19
+ for (const [, bwErrors] of results) {
20
+ for (const bwError of bwErrors) {
21
+ errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation errors', bwError))
22
+ }
23
+ }
24
+ } catch (ex) {
25
+ errors.push(new BoundWitnessValidationError((bw as WithStorageMeta<BoundWitness>)?._hash ?? ZERO_HASH, bw, 'validation excepted', ex))
26
+ }
27
+ return errors
28
+ }
@@ -0,0 +1,2 @@
1
+ export * from './BoundWitnessReferences.ts'
2
+ export * from './BoundWitnessSignatures.ts'
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './boundwitness/index.ts'
2
+ export * from './transaction/index.ts'
@@ -0,0 +1,2 @@
1
+ export * from './validateTransaction.ts'
2
+ export * from './validators/index.ts'