@xyo-network/boundwitness-validator 2.107.3 → 2.107.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.
@@ -1,2 +1,140 @@
1
- "use strict";var n=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var o=(e,r)=>n(e,"name",{value:r,configurable:!0});var w=(e,r)=>{for(var s in r)n(e,s,{get:r[s],enumerable:!0})},j=(e,r,s,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of $(r))!b.call(e,a)&&a!==s&&n(e,a,{get:()=>r[a],enumerable:!(t=v(r,a))||t.enumerable});return e};var A=e=>j(n({},"__esModule",{value:!0}),e);var L={};w(L,{BoundWitnessValidator:()=>c});module.exports=A(L);var i=require("@xylabs/arraybuffer"),m=require("@xylabs/lodash"),h=require("@xylabs/typeof"),l=require("@xyo-network/account"),p=require("@xyo-network/boundwitness-model"),g=require("@xyo-network/payload"),d=require("@xyo-network/payload-validator");var E=o((e,r,s="Array length mismatch")=>e.length==r.length?[]:[new Error(`${s} []`)],"validateArraysSameLength"),c=class e extends d.PayloadValidator{static{o(this,"BoundWitnessValidator")}get expectedSchema(){return p.BoundWitnessSchema}static validateSignature(r,s,t){return t?new l.AddressValue((0,i.toUint8Array)(s)).verify(r,t)?[]:[new Error(`Invalid signature [${s}] [${t}]`)]:[new Error(`Missing signature [${s}]`)]}addresses(){let r=[];return r.push(...this.addressesUniqueness()),r}addressesUniqueness(){let r=[],{addresses:s}=this.obj,t=(0,m.uniq)(s);return s?.length!==t?.length&&r.push(new Error("addresses must be unique")),r}previousHashes(){return[]}schema(){let r=[];return this.obj.schema!==this.expectedSchema&&r.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),r}schemas(){let r=[],s=this.obj.payload_schemas;if(s){let t=s.map(a=>d.PayloadValidator.schemaNameValidatorFactory?.(a));for(let a of t)a&&r.push(...a.all())}return r}async signatures(){return[...E(this.obj.$meta?.signatures??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(this.obj.addresses?.map(async(r,s)=>e.validateSignature((0,i.toUint8Array)(await g.PayloadBuilder.dataHash(this.payload)),(0,i.toUint8Array)(r),(0,i.toUint8Array)(this.obj.$meta?.signatures?.[s])))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let r=[];return r.push(...this.validatePayloadHashesLength()),r}validatePayloadHashesLength(){let r=[];return r.push(...this.validateArrayLength("payload_hashes","payload_schemas")),r}validateArrayLength(r,s){let t=[],[a,y]=(0,h.validateType)("array",this.stringKeyObj[r],!0),[u,f]=(0,h.validateType)("array",this.stringKeyObj[s],!0);return a?.length!==u?.length&&t.push(new Error(`${r}/${s} count mismatch [${a?.length} !== ${u?.length}]`)),[...y,...f,...t]}};
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ BoundWitnessValidator: () => BoundWitnessValidator
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/Validator.ts
29
+ var import_arraybuffer = require("@xylabs/arraybuffer");
30
+ var import_lodash = require("@xylabs/lodash");
31
+ var import_typeof = require("@xylabs/typeof");
32
+ var import_account = require("@xyo-network/account");
33
+ var import_boundwitness_model = require("@xyo-network/boundwitness-model");
34
+ var import_payload = require("@xyo-network/payload");
35
+ var import_payload_validator = require("@xyo-network/payload-validator");
36
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
37
+ return a.length == b.length ? [] : [
38
+ new Error(`${message} []`)
39
+ ];
40
+ }, "validateArraysSameLength");
41
+ var BoundWitnessValidator = class _BoundWitnessValidator extends import_payload_validator.PayloadValidator {
42
+ static {
43
+ __name(this, "BoundWitnessValidator");
44
+ }
45
+ get expectedSchema() {
46
+ return import_boundwitness_model.BoundWitnessSchema;
47
+ }
48
+ static validateSignature(hash, address, signature) {
49
+ if (!signature) {
50
+ return [
51
+ new Error(`Missing signature [${address}]`)
52
+ ];
53
+ }
54
+ if (!new import_account.AddressValue((0, import_arraybuffer.toUint8Array)(address)).verify(hash, signature)) {
55
+ return [
56
+ new Error(`Invalid signature [${address}] [${signature}]`)
57
+ ];
58
+ }
59
+ return [];
60
+ }
61
+ addresses() {
62
+ const errors = [];
63
+ errors.push(...this.addressesUniqueness());
64
+ return errors;
65
+ }
66
+ addressesUniqueness() {
67
+ const errors = [];
68
+ const { addresses } = this.obj;
69
+ const uniqAddresses = (0, import_lodash.uniq)(addresses);
70
+ if (addresses?.length !== uniqAddresses?.length) errors.push(new Error("addresses must be unique"));
71
+ return errors;
72
+ }
73
+ previousHashes() {
74
+ const errors = [];
75
+ return errors;
76
+ }
77
+ schema() {
78
+ const errors = [];
79
+ if (this.obj.schema !== this.expectedSchema) {
80
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
81
+ }
82
+ return errors;
83
+ }
84
+ schemas() {
85
+ const errors = [];
86
+ const Schemas = this.obj.payload_schemas;
87
+ if (Schemas) {
88
+ const schemaValidators = Schemas.map((schema) => {
89
+ return import_payload_validator.PayloadValidator.schemaNameValidatorFactory?.(schema);
90
+ });
91
+ for (const validator of schemaValidators) {
92
+ if (validator) {
93
+ errors.push(...validator.all());
94
+ }
95
+ }
96
+ }
97
+ return errors;
98
+ }
99
+ async signatures() {
100
+ return [
101
+ ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
102
+ ...(await Promise.all(this.obj.addresses?.map(async (address, index) => _BoundWitnessValidator.validateSignature((0, import_arraybuffer.toUint8Array)(await import_payload.PayloadBuilder.dataHash(this.payload)), (0, import_arraybuffer.toUint8Array)(address), (0, import_arraybuffer.toUint8Array)(this.obj.$meta?.signatures?.[index]))) ?? [])).flat()
103
+ ];
104
+ }
105
+ async validate() {
106
+ return [
107
+ ...await this.signatures(),
108
+ ...this.addresses(),
109
+ ...this.validateArrayLengths(),
110
+ ...this.schemas(),
111
+ ...this.previousHashes(),
112
+ ...this.schema(),
113
+ ...await super.validate()
114
+ ];
115
+ }
116
+ validateArrayLengths() {
117
+ const errors = [];
118
+ errors.push(...this.validatePayloadHashesLength());
119
+ return errors;
120
+ }
121
+ validatePayloadHashesLength() {
122
+ const errors = [];
123
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
124
+ return errors;
125
+ }
126
+ validateArrayLength(fieldName, compareArrayName) {
127
+ const errors = [];
128
+ const [array, arrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[fieldName], true);
129
+ const [compareArray, compareArrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[compareArrayName], true);
130
+ if (array?.length !== compareArray?.length) {
131
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`));
132
+ }
133
+ return [
134
+ ...arrayErrors,
135
+ ...compareArrayErrors,
136
+ ...errors
137
+ ];
138
+ }
139
+ };
2
140
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GCAA,IAAAI,EAA6B,+BAC7BC,EAAqB,0BACrBC,EAA6B,0BAC7BC,EAA6B,gCAC7BC,EAAiD,2CACjDC,EAA+B,gCAC/BC,EAAiC,0CAEjC,IAAMC,EAA2BC,EAAA,CAACC,EAAcC,EAAcC,EAAU,0BAC/DF,EAAEG,QAAUF,EAAEE,OAAS,CAAA,EAAK,CAAC,IAAIC,MAAM,GAAGF,CAAAA,KAAY,GAD9B,4BAIpBG,EAAN,MAAMA,UAAyFC,kBAAAA,CAZtG,MAYsGA,CAAAA,EAAAA,8BACpG,IAAcC,gBAAyB,CACrC,OAAOC,oBACT,CAEA,OAAOC,kBAAkBC,EAAmBC,EAAsBC,EAAkC,CAClG,OAAKA,EAGA,IAAIC,kBAAaC,gBAAaH,CAAAA,CAAAA,EAAUI,OAAOL,EAAME,CAAAA,EAGnD,CAAA,EAFE,CAAC,IAAIR,MAAM,sBAAsBO,CAAAA,MAAaC,CAAAA,GAAY,GAH1D,CAAC,IAAIR,MAAM,sBAAsBO,CAAAA,GAAU,EAMtD,CAEAK,WAAqB,CACnB,IAAMC,EAAkB,CAAA,EAGxBA,OAAAA,EAAOC,KAAI,GAAI,KAAKC,oBAAmB,CAAA,EAChCF,CACT,CAEAE,qBAA+B,CAC7B,IAAMF,EAAkB,CAAA,EAClB,CAAED,UAAAA,CAAS,EAAK,KAAKI,IACrBC,KAAgBC,QAAKN,CAAAA,EAC3B,OAAIA,GAAWb,SAAWkB,GAAelB,QAAQc,EAAOC,KAAK,IAAId,MAAM,0BAAA,CAAA,EAChEa,CACT,CAEAM,gBAAiB,CAEf,MADwB,CAAA,CAE1B,CAEAC,QAAkB,CAChB,IAAMP,EAAkB,CAAA,EACxB,OAAI,KAAKG,IAAII,SAAW,KAAKjB,gBAC3BU,EAAOC,KAAK,IAAId,MAAM,mBAAmB,KAAKG,cAAc,QAAQ,KAAKa,IAAII,MAAM,GAAG,CAAA,EAEjFP,CACT,CAEAQ,SAAmB,CACjB,IAAMR,EAAkB,CAAA,EAClBS,EAAU,KAAKN,IAAIO,gBACzB,GAAID,EAAS,CACX,IAAME,EAAmBF,EAAQG,IAAKL,GAC7BlB,mBAAiBwB,6BAA6BN,CAAAA,CACvD,EACA,QAAWO,KAAaH,EAClBG,GACFd,EAAOC,KAAI,GAAIa,EAAUC,IAAG,CAAA,CAGlC,CACA,OAAOf,CACT,CAEA,MAAMgB,YAA+B,CACnC,MAAO,IACFnC,EAAyB,KAAKsB,IAAIc,OAAOD,YAAc,CAAA,EAAI,KAAKb,IAAIJ,WAAa,CAAA,EAAI,oCAAA,MAEtF,MAAMmB,QAAQH,IACZ,KAAKZ,IAAIJ,WAAWa,IAAsB,MAAOlB,EAASyB,IACxD/B,EAAsBI,qBACpBK,gBAAa,MAAMuB,iBAAeC,SAAS,KAAKC,OAAO,CAAA,KACvDzB,gBAAaH,CAAAA,KACbG,gBAAa,KAAKM,IAAIc,OAAOD,aAAaG,CAAAA,CAAM,CAAA,CAAA,GAE/C,CAAA,CAAE,GAETI,KAAI,EAEV,CAEA,MAAeC,UAAW,CACxB,MAAO,IACD,MAAM,KAAKR,WAAU,KACtB,KAAKjB,UAAS,KACd,KAAK0B,qBAAoB,KACzB,KAAKjB,QAAO,KACZ,KAAKF,eAAc,KACnB,KAAKC,OAAM,KACV,MAAM,MAAMiB,SAAAA,EAEpB,CAEAC,sBAAgC,CAC9B,IAAMzB,EAAkB,CAAA,EACxBA,OAAAA,EAAOC,KAAI,GAAI,KAAKyB,4BAA2B,CAAA,EACxC1B,CACT,CAEA0B,6BAAuC,CACrC,IAAM1B,EAAkB,CAAA,EACxBA,OAAAA,EAAOC,KAAI,GAAI,KAAK0B,oBAAoB,iBAAkB,iBAAA,CAAA,EACnD3B,CACT,CAEQ2B,oBAAoBC,EAAmBC,EAAmC,CAChF,IAAM7B,EAAkB,CAAA,EAElB,CAAC8B,EAAOC,CAAAA,KAAeC,gBAAa,QAAS,KAAKC,aAAaL,CAAAA,EAAkB,EAAA,EACjF,CAACM,EAAcC,CAAAA,KAAsBH,gBAAa,QAAS,KAAKC,aAAaJ,CAAAA,EAAyB,EAAA,EAE5G,OAAIC,GAAO5C,SAAWgD,GAAchD,QAClCc,EAAOC,KAAK,IAAId,MAAM,GAAGyC,CAAAA,IAAaC,CAAAA,oBAAoCC,GAAO5C,MAAAA,QAAcgD,GAAchD,MAAAA,GAAS,CAAA,EAGjH,IAAI6C,KAAgBI,KAAuBnC,EACpD,CACF","names":["src_exports","__export","BoundWitnessValidator","__toCommonJS","import_arraybuffer","import_lodash","import_typeof","import_account","import_boundwitness_model","import_payload","import_payload_validator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
@@ -1,2 +1,119 @@
1
- var l=Object.defineProperty;var n=(a,r)=>l(a,"name",{value:r,configurable:!0});import{toUint8Array as i}from"@xylabs/arraybuffer";import{uniq as p}from"@xylabs/lodash";import{validateType as h}from"@xylabs/typeof";import{AddressValue as g}from"@xyo-network/account";import{BoundWitnessSchema as y}from"@xyo-network/boundwitness-model";import{PayloadBuilder as f}from"@xyo-network/payload";import{PayloadValidator as d}from"@xyo-network/payload-validator";var v=n((a,r,s="Array length mismatch")=>a.length==r.length?[]:[new Error(`${s} []`)],"validateArraysSameLength"),c=class a extends d{static{n(this,"BoundWitnessValidator")}get expectedSchema(){return y}static validateSignature(r,s,e){return e?new g(i(s)).verify(r,e)?[]:[new Error(`Invalid signature [${s}] [${e}]`)]:[new Error(`Missing signature [${s}]`)]}addresses(){let r=[];return r.push(...this.addressesUniqueness()),r}addressesUniqueness(){let r=[],{addresses:s}=this.obj,e=p(s);return s?.length!==e?.length&&r.push(new Error("addresses must be unique")),r}previousHashes(){return[]}schema(){let r=[];return this.obj.schema!==this.expectedSchema&&r.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),r}schemas(){let r=[],s=this.obj.payload_schemas;if(s){let e=s.map(t=>d.schemaNameValidatorFactory?.(t));for(let t of e)t&&r.push(...t.all())}return r}async signatures(){return[...v(this.obj.$meta?.signatures??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(this.obj.addresses?.map(async(r,s)=>a.validateSignature(i(await f.dataHash(this.payload)),i(r),i(this.obj.$meta?.signatures?.[s])))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let r=[];return r.push(...this.validatePayloadHashesLength()),r}validatePayloadHashesLength(){let r=[];return r.push(...this.validateArrayLength("payload_hashes","payload_schemas")),r}validateArrayLength(r,s){let e=[],[t,u]=h("array",this.stringKeyObj[r],!0),[o,m]=h("array",this.stringKeyObj[s],!0);return t?.length!==o?.length&&e.push(new Error(`${r}/${s} count mismatch [${t?.length} !== ${o?.length}]`)),[...u,...m,...e]}};export{c as BoundWitnessValidator};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/Validator.ts
5
+ import { toUint8Array } from "@xylabs/arraybuffer";
6
+ import { uniq } from "@xylabs/lodash";
7
+ import { validateType } from "@xylabs/typeof";
8
+ import { AddressValue } from "@xyo-network/account";
9
+ import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
10
+ import { PayloadBuilder } from "@xyo-network/payload";
11
+ import { PayloadValidator } from "@xyo-network/payload-validator";
12
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
13
+ return a.length == b.length ? [] : [
14
+ new Error(`${message} []`)
15
+ ];
16
+ }, "validateArraysSameLength");
17
+ var BoundWitnessValidator = class _BoundWitnessValidator extends PayloadValidator {
18
+ static {
19
+ __name(this, "BoundWitnessValidator");
20
+ }
21
+ get expectedSchema() {
22
+ return BoundWitnessSchema;
23
+ }
24
+ static validateSignature(hash, address, signature) {
25
+ if (!signature) {
26
+ return [
27
+ new Error(`Missing signature [${address}]`)
28
+ ];
29
+ }
30
+ if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {
31
+ return [
32
+ new Error(`Invalid signature [${address}] [${signature}]`)
33
+ ];
34
+ }
35
+ return [];
36
+ }
37
+ addresses() {
38
+ const errors = [];
39
+ errors.push(...this.addressesUniqueness());
40
+ return errors;
41
+ }
42
+ addressesUniqueness() {
43
+ const errors = [];
44
+ const { addresses } = this.obj;
45
+ const uniqAddresses = uniq(addresses);
46
+ if (addresses?.length !== uniqAddresses?.length) errors.push(new Error("addresses must be unique"));
47
+ return errors;
48
+ }
49
+ previousHashes() {
50
+ const errors = [];
51
+ return errors;
52
+ }
53
+ schema() {
54
+ const errors = [];
55
+ if (this.obj.schema !== this.expectedSchema) {
56
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
57
+ }
58
+ return errors;
59
+ }
60
+ schemas() {
61
+ const errors = [];
62
+ const Schemas = this.obj.payload_schemas;
63
+ if (Schemas) {
64
+ const schemaValidators = Schemas.map((schema) => {
65
+ return PayloadValidator.schemaNameValidatorFactory?.(schema);
66
+ });
67
+ for (const validator of schemaValidators) {
68
+ if (validator) {
69
+ errors.push(...validator.all());
70
+ }
71
+ }
72
+ }
73
+ return errors;
74
+ }
75
+ async signatures() {
76
+ return [
77
+ ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
78
+ ...(await Promise.all(this.obj.addresses?.map(async (address, index) => _BoundWitnessValidator.validateSignature(toUint8Array(await PayloadBuilder.dataHash(this.payload)), toUint8Array(address), toUint8Array(this.obj.$meta?.signatures?.[index]))) ?? [])).flat()
79
+ ];
80
+ }
81
+ async validate() {
82
+ return [
83
+ ...await this.signatures(),
84
+ ...this.addresses(),
85
+ ...this.validateArrayLengths(),
86
+ ...this.schemas(),
87
+ ...this.previousHashes(),
88
+ ...this.schema(),
89
+ ...await super.validate()
90
+ ];
91
+ }
92
+ validateArrayLengths() {
93
+ const errors = [];
94
+ errors.push(...this.validatePayloadHashesLength());
95
+ return errors;
96
+ }
97
+ validatePayloadHashesLength() {
98
+ const errors = [];
99
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
100
+ return errors;
101
+ }
102
+ validateArrayLength(fieldName, compareArrayName) {
103
+ const errors = [];
104
+ const [array, arrayErrors] = validateType("array", this.stringKeyObj[fieldName], true);
105
+ const [compareArray, compareArrayErrors] = validateType("array", this.stringKeyObj[compareArrayName], true);
106
+ if (array?.length !== compareArray?.length) {
107
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`));
108
+ }
109
+ return [
110
+ ...arrayErrors,
111
+ ...compareArrayErrors,
112
+ ...errors
113
+ ];
114
+ }
115
+ };
116
+ export {
117
+ BoundWitnessValidator
118
+ };
2
119
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
1
+ {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
@@ -1,2 +1,140 @@
1
- "use strict";var n=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var o=(e,r)=>n(e,"name",{value:r,configurable:!0});var w=(e,r)=>{for(var s in r)n(e,s,{get:r[s],enumerable:!0})},j=(e,r,s,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of $(r))!b.call(e,a)&&a!==s&&n(e,a,{get:()=>r[a],enumerable:!(t=v(r,a))||t.enumerable});return e};var A=e=>j(n({},"__esModule",{value:!0}),e);var L={};w(L,{BoundWitnessValidator:()=>c});module.exports=A(L);var i=require("@xylabs/arraybuffer"),m=require("@xylabs/lodash"),h=require("@xylabs/typeof"),l=require("@xyo-network/account"),p=require("@xyo-network/boundwitness-model"),g=require("@xyo-network/payload"),d=require("@xyo-network/payload-validator");var E=o((e,r,s="Array length mismatch")=>e.length==r.length?[]:[new Error(`${s} []`)],"validateArraysSameLength"),c=class e extends d.PayloadValidator{static{o(this,"BoundWitnessValidator")}get expectedSchema(){return p.BoundWitnessSchema}static validateSignature(r,s,t){return t?new l.AddressValue((0,i.toUint8Array)(s)).verify(r,t)?[]:[new Error(`Invalid signature [${s}] [${t}]`)]:[new Error(`Missing signature [${s}]`)]}addresses(){let r=[];return r.push(...this.addressesUniqueness()),r}addressesUniqueness(){let r=[],{addresses:s}=this.obj,t=(0,m.uniq)(s);return s?.length!==t?.length&&r.push(new Error("addresses must be unique")),r}previousHashes(){return[]}schema(){let r=[];return this.obj.schema!==this.expectedSchema&&r.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),r}schemas(){let r=[],s=this.obj.payload_schemas;if(s){let t=s.map(a=>d.PayloadValidator.schemaNameValidatorFactory?.(a));for(let a of t)a&&r.push(...a.all())}return r}async signatures(){return[...E(this.obj.$meta?.signatures??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(this.obj.addresses?.map(async(r,s)=>e.validateSignature((0,i.toUint8Array)(await g.PayloadBuilder.dataHash(this.payload)),(0,i.toUint8Array)(r),(0,i.toUint8Array)(this.obj.$meta?.signatures?.[s])))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let r=[];return r.push(...this.validatePayloadHashesLength()),r}validatePayloadHashesLength(){let r=[];return r.push(...this.validateArrayLength("payload_hashes","payload_schemas")),r}validateArrayLength(r,s){let t=[],[a,y]=(0,h.validateType)("array",this.stringKeyObj[r],!0),[u,f]=(0,h.validateType)("array",this.stringKeyObj[s],!0);return a?.length!==u?.length&&t.push(new Error(`${r}/${s} count mismatch [${a?.length} !== ${u?.length}]`)),[...y,...f,...t]}};
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ BoundWitnessValidator: () => BoundWitnessValidator
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/Validator.ts
29
+ var import_arraybuffer = require("@xylabs/arraybuffer");
30
+ var import_lodash = require("@xylabs/lodash");
31
+ var import_typeof = require("@xylabs/typeof");
32
+ var import_account = require("@xyo-network/account");
33
+ var import_boundwitness_model = require("@xyo-network/boundwitness-model");
34
+ var import_payload = require("@xyo-network/payload");
35
+ var import_payload_validator = require("@xyo-network/payload-validator");
36
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
37
+ return a.length == b.length ? [] : [
38
+ new Error(`${message} []`)
39
+ ];
40
+ }, "validateArraysSameLength");
41
+ var BoundWitnessValidator = class _BoundWitnessValidator extends import_payload_validator.PayloadValidator {
42
+ static {
43
+ __name(this, "BoundWitnessValidator");
44
+ }
45
+ get expectedSchema() {
46
+ return import_boundwitness_model.BoundWitnessSchema;
47
+ }
48
+ static validateSignature(hash, address, signature) {
49
+ if (!signature) {
50
+ return [
51
+ new Error(`Missing signature [${address}]`)
52
+ ];
53
+ }
54
+ if (!new import_account.AddressValue((0, import_arraybuffer.toUint8Array)(address)).verify(hash, signature)) {
55
+ return [
56
+ new Error(`Invalid signature [${address}] [${signature}]`)
57
+ ];
58
+ }
59
+ return [];
60
+ }
61
+ addresses() {
62
+ const errors = [];
63
+ errors.push(...this.addressesUniqueness());
64
+ return errors;
65
+ }
66
+ addressesUniqueness() {
67
+ const errors = [];
68
+ const { addresses } = this.obj;
69
+ const uniqAddresses = (0, import_lodash.uniq)(addresses);
70
+ if (addresses?.length !== uniqAddresses?.length) errors.push(new Error("addresses must be unique"));
71
+ return errors;
72
+ }
73
+ previousHashes() {
74
+ const errors = [];
75
+ return errors;
76
+ }
77
+ schema() {
78
+ const errors = [];
79
+ if (this.obj.schema !== this.expectedSchema) {
80
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
81
+ }
82
+ return errors;
83
+ }
84
+ schemas() {
85
+ const errors = [];
86
+ const Schemas = this.obj.payload_schemas;
87
+ if (Schemas) {
88
+ const schemaValidators = Schemas.map((schema) => {
89
+ return import_payload_validator.PayloadValidator.schemaNameValidatorFactory?.(schema);
90
+ });
91
+ for (const validator of schemaValidators) {
92
+ if (validator) {
93
+ errors.push(...validator.all());
94
+ }
95
+ }
96
+ }
97
+ return errors;
98
+ }
99
+ async signatures() {
100
+ return [
101
+ ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
102
+ ...(await Promise.all(this.obj.addresses?.map(async (address, index) => _BoundWitnessValidator.validateSignature((0, import_arraybuffer.toUint8Array)(await import_payload.PayloadBuilder.dataHash(this.payload)), (0, import_arraybuffer.toUint8Array)(address), (0, import_arraybuffer.toUint8Array)(this.obj.$meta?.signatures?.[index]))) ?? [])).flat()
103
+ ];
104
+ }
105
+ async validate() {
106
+ return [
107
+ ...await this.signatures(),
108
+ ...this.addresses(),
109
+ ...this.validateArrayLengths(),
110
+ ...this.schemas(),
111
+ ...this.previousHashes(),
112
+ ...this.schema(),
113
+ ...await super.validate()
114
+ ];
115
+ }
116
+ validateArrayLengths() {
117
+ const errors = [];
118
+ errors.push(...this.validatePayloadHashesLength());
119
+ return errors;
120
+ }
121
+ validatePayloadHashesLength() {
122
+ const errors = [];
123
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
124
+ return errors;
125
+ }
126
+ validateArrayLength(fieldName, compareArrayName) {
127
+ const errors = [];
128
+ const [array, arrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[fieldName], true);
129
+ const [compareArray, compareArrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[compareArrayName], true);
130
+ if (array?.length !== compareArray?.length) {
131
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`));
132
+ }
133
+ return [
134
+ ...arrayErrors,
135
+ ...compareArrayErrors,
136
+ ...errors
137
+ ];
138
+ }
139
+ };
2
140
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GCAA,IAAAI,EAA6B,+BAC7BC,EAAqB,0BACrBC,EAA6B,0BAC7BC,EAA6B,gCAC7BC,EAAiD,2CACjDC,EAA+B,gCAC/BC,EAAiC,0CAEjC,IAAMC,EAA2BC,EAAA,CAACC,EAAcC,EAAcC,EAAU,0BAC/DF,EAAEG,QAAUF,EAAEE,OAAS,CAAA,EAAK,CAAC,IAAIC,MAAM,GAAGF,CAAAA,KAAY,GAD9B,4BAIpBG,EAAN,MAAMA,UAAyFC,kBAAAA,CAZtG,MAYsGA,CAAAA,EAAAA,8BACpG,IAAcC,gBAAyB,CACrC,OAAOC,oBACT,CAEA,OAAOC,kBAAkBC,EAAmBC,EAAsBC,EAAkC,CAClG,OAAKA,EAGA,IAAIC,kBAAaC,gBAAaH,CAAAA,CAAAA,EAAUI,OAAOL,EAAME,CAAAA,EAGnD,CAAA,EAFE,CAAC,IAAIR,MAAM,sBAAsBO,CAAAA,MAAaC,CAAAA,GAAY,GAH1D,CAAC,IAAIR,MAAM,sBAAsBO,CAAAA,GAAU,EAMtD,CAEAK,WAAqB,CACnB,IAAMC,EAAkB,CAAA,EAGxBA,OAAAA,EAAOC,KAAI,GAAI,KAAKC,oBAAmB,CAAA,EAChCF,CACT,CAEAE,qBAA+B,CAC7B,IAAMF,EAAkB,CAAA,EAClB,CAAED,UAAAA,CAAS,EAAK,KAAKI,IACrBC,KAAgBC,QAAKN,CAAAA,EAC3B,OAAIA,GAAWb,SAAWkB,GAAelB,QAAQc,EAAOC,KAAK,IAAId,MAAM,0BAAA,CAAA,EAChEa,CACT,CAEAM,gBAAiB,CAEf,MADwB,CAAA,CAE1B,CAEAC,QAAkB,CAChB,IAAMP,EAAkB,CAAA,EACxB,OAAI,KAAKG,IAAII,SAAW,KAAKjB,gBAC3BU,EAAOC,KAAK,IAAId,MAAM,mBAAmB,KAAKG,cAAc,QAAQ,KAAKa,IAAII,MAAM,GAAG,CAAA,EAEjFP,CACT,CAEAQ,SAAmB,CACjB,IAAMR,EAAkB,CAAA,EAClBS,EAAU,KAAKN,IAAIO,gBACzB,GAAID,EAAS,CACX,IAAME,EAAmBF,EAAQG,IAAKL,GAC7BlB,mBAAiBwB,6BAA6BN,CAAAA,CACvD,EACA,QAAWO,KAAaH,EAClBG,GACFd,EAAOC,KAAI,GAAIa,EAAUC,IAAG,CAAA,CAGlC,CACA,OAAOf,CACT,CAEA,MAAMgB,YAA+B,CACnC,MAAO,IACFnC,EAAyB,KAAKsB,IAAIc,OAAOD,YAAc,CAAA,EAAI,KAAKb,IAAIJ,WAAa,CAAA,EAAI,oCAAA,MAEtF,MAAMmB,QAAQH,IACZ,KAAKZ,IAAIJ,WAAWa,IAAsB,MAAOlB,EAASyB,IACxD/B,EAAsBI,qBACpBK,gBAAa,MAAMuB,iBAAeC,SAAS,KAAKC,OAAO,CAAA,KACvDzB,gBAAaH,CAAAA,KACbG,gBAAa,KAAKM,IAAIc,OAAOD,aAAaG,CAAAA,CAAM,CAAA,CAAA,GAE/C,CAAA,CAAE,GAETI,KAAI,EAEV,CAEA,MAAeC,UAAW,CACxB,MAAO,IACD,MAAM,KAAKR,WAAU,KACtB,KAAKjB,UAAS,KACd,KAAK0B,qBAAoB,KACzB,KAAKjB,QAAO,KACZ,KAAKF,eAAc,KACnB,KAAKC,OAAM,KACV,MAAM,MAAMiB,SAAAA,EAEpB,CAEAC,sBAAgC,CAC9B,IAAMzB,EAAkB,CAAA,EACxBA,OAAAA,EAAOC,KAAI,GAAI,KAAKyB,4BAA2B,CAAA,EACxC1B,CACT,CAEA0B,6BAAuC,CACrC,IAAM1B,EAAkB,CAAA,EACxBA,OAAAA,EAAOC,KAAI,GAAI,KAAK0B,oBAAoB,iBAAkB,iBAAA,CAAA,EACnD3B,CACT,CAEQ2B,oBAAoBC,EAAmBC,EAAmC,CAChF,IAAM7B,EAAkB,CAAA,EAElB,CAAC8B,EAAOC,CAAAA,KAAeC,gBAAa,QAAS,KAAKC,aAAaL,CAAAA,EAAkB,EAAA,EACjF,CAACM,EAAcC,CAAAA,KAAsBH,gBAAa,QAAS,KAAKC,aAAaJ,CAAAA,EAAyB,EAAA,EAE5G,OAAIC,GAAO5C,SAAWgD,GAAchD,QAClCc,EAAOC,KAAK,IAAId,MAAM,GAAGyC,CAAAA,IAAaC,CAAAA,oBAAoCC,GAAO5C,MAAAA,QAAcgD,GAAchD,MAAAA,GAAS,CAAA,EAGjH,IAAI6C,KAAgBI,KAAuBnC,EACpD,CACF","names":["src_exports","__export","BoundWitnessValidator","__toCommonJS","import_arraybuffer","import_lodash","import_typeof","import_account","import_boundwitness_model","import_payload","import_payload_validator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
@@ -1,2 +1,119 @@
1
- var l=Object.defineProperty;var n=(a,r)=>l(a,"name",{value:r,configurable:!0});import{toUint8Array as i}from"@xylabs/arraybuffer";import{uniq as p}from"@xylabs/lodash";import{validateType as h}from"@xylabs/typeof";import{AddressValue as g}from"@xyo-network/account";import{BoundWitnessSchema as y}from"@xyo-network/boundwitness-model";import{PayloadBuilder as f}from"@xyo-network/payload";import{PayloadValidator as d}from"@xyo-network/payload-validator";var v=n((a,r,s="Array length mismatch")=>a.length==r.length?[]:[new Error(`${s} []`)],"validateArraysSameLength"),c=class a extends d{static{n(this,"BoundWitnessValidator")}get expectedSchema(){return y}static validateSignature(r,s,e){return e?new g(i(s)).verify(r,e)?[]:[new Error(`Invalid signature [${s}] [${e}]`)]:[new Error(`Missing signature [${s}]`)]}addresses(){let r=[];return r.push(...this.addressesUniqueness()),r}addressesUniqueness(){let r=[],{addresses:s}=this.obj,e=p(s);return s?.length!==e?.length&&r.push(new Error("addresses must be unique")),r}previousHashes(){return[]}schema(){let r=[];return this.obj.schema!==this.expectedSchema&&r.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),r}schemas(){let r=[],s=this.obj.payload_schemas;if(s){let e=s.map(t=>d.schemaNameValidatorFactory?.(t));for(let t of e)t&&r.push(...t.all())}return r}async signatures(){return[...v(this.obj.$meta?.signatures??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(this.obj.addresses?.map(async(r,s)=>a.validateSignature(i(await f.dataHash(this.payload)),i(r),i(this.obj.$meta?.signatures?.[s])))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let r=[];return r.push(...this.validatePayloadHashesLength()),r}validatePayloadHashesLength(){let r=[];return r.push(...this.validateArrayLength("payload_hashes","payload_schemas")),r}validateArrayLength(r,s){let e=[],[t,u]=h("array",this.stringKeyObj[r],!0),[o,m]=h("array",this.stringKeyObj[s],!0);return t?.length!==o?.length&&e.push(new Error(`${r}/${s} count mismatch [${t?.length} !== ${o?.length}]`)),[...u,...m,...e]}};export{c as BoundWitnessValidator};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/Validator.ts
5
+ import { toUint8Array } from "@xylabs/arraybuffer";
6
+ import { uniq } from "@xylabs/lodash";
7
+ import { validateType } from "@xylabs/typeof";
8
+ import { AddressValue } from "@xyo-network/account";
9
+ import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
10
+ import { PayloadBuilder } from "@xyo-network/payload";
11
+ import { PayloadValidator } from "@xyo-network/payload-validator";
12
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
13
+ return a.length == b.length ? [] : [
14
+ new Error(`${message} []`)
15
+ ];
16
+ }, "validateArraysSameLength");
17
+ var BoundWitnessValidator = class _BoundWitnessValidator extends PayloadValidator {
18
+ static {
19
+ __name(this, "BoundWitnessValidator");
20
+ }
21
+ get expectedSchema() {
22
+ return BoundWitnessSchema;
23
+ }
24
+ static validateSignature(hash, address, signature) {
25
+ if (!signature) {
26
+ return [
27
+ new Error(`Missing signature [${address}]`)
28
+ ];
29
+ }
30
+ if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {
31
+ return [
32
+ new Error(`Invalid signature [${address}] [${signature}]`)
33
+ ];
34
+ }
35
+ return [];
36
+ }
37
+ addresses() {
38
+ const errors = [];
39
+ errors.push(...this.addressesUniqueness());
40
+ return errors;
41
+ }
42
+ addressesUniqueness() {
43
+ const errors = [];
44
+ const { addresses } = this.obj;
45
+ const uniqAddresses = uniq(addresses);
46
+ if (addresses?.length !== uniqAddresses?.length) errors.push(new Error("addresses must be unique"));
47
+ return errors;
48
+ }
49
+ previousHashes() {
50
+ const errors = [];
51
+ return errors;
52
+ }
53
+ schema() {
54
+ const errors = [];
55
+ if (this.obj.schema !== this.expectedSchema) {
56
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
57
+ }
58
+ return errors;
59
+ }
60
+ schemas() {
61
+ const errors = [];
62
+ const Schemas = this.obj.payload_schemas;
63
+ if (Schemas) {
64
+ const schemaValidators = Schemas.map((schema) => {
65
+ return PayloadValidator.schemaNameValidatorFactory?.(schema);
66
+ });
67
+ for (const validator of schemaValidators) {
68
+ if (validator) {
69
+ errors.push(...validator.all());
70
+ }
71
+ }
72
+ }
73
+ return errors;
74
+ }
75
+ async signatures() {
76
+ return [
77
+ ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
78
+ ...(await Promise.all(this.obj.addresses?.map(async (address, index) => _BoundWitnessValidator.validateSignature(toUint8Array(await PayloadBuilder.dataHash(this.payload)), toUint8Array(address), toUint8Array(this.obj.$meta?.signatures?.[index]))) ?? [])).flat()
79
+ ];
80
+ }
81
+ async validate() {
82
+ return [
83
+ ...await this.signatures(),
84
+ ...this.addresses(),
85
+ ...this.validateArrayLengths(),
86
+ ...this.schemas(),
87
+ ...this.previousHashes(),
88
+ ...this.schema(),
89
+ ...await super.validate()
90
+ ];
91
+ }
92
+ validateArrayLengths() {
93
+ const errors = [];
94
+ errors.push(...this.validatePayloadHashesLength());
95
+ return errors;
96
+ }
97
+ validatePayloadHashesLength() {
98
+ const errors = [];
99
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
100
+ return errors;
101
+ }
102
+ validateArrayLength(fieldName, compareArrayName) {
103
+ const errors = [];
104
+ const [array, arrayErrors] = validateType("array", this.stringKeyObj[fieldName], true);
105
+ const [compareArray, compareArrayErrors] = validateType("array", this.stringKeyObj[compareArrayName], true);
106
+ if (array?.length !== compareArray?.length) {
107
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`));
108
+ }
109
+ return [
110
+ ...arrayErrors,
111
+ ...compareArrayErrors,
112
+ ...errors
113
+ ];
114
+ }
115
+ };
116
+ export {
117
+ BoundWitnessValidator
118
+ };
2
119
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
1
+ {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":";;;;AAAA,SAASA,oBAAoB;AAC7B,SAASC,YAAY;AACrB,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAAuBC,0BAA0B;AACjD,SAASC,sBAAsB;AAC/B,SAASC,wBAAwB;AAEjC,IAAMC,2BAA2B,wBAACC,GAAcC,GAAcC,UAAU,4BAAuB;AAC7F,SAAOF,EAAEG,UAAUF,EAAEE,SAAS,CAAA,IAAK;IAAC,IAAIC,MAAM,GAAGF,OAAAA,KAAY;;AAC/D,GAFiC;AAI1B,IAAMG,wBAAN,MAAMA,+BAAyFC,iBAAAA;EAZtG,OAYsGA;;;EACpG,IAAcC,iBAAyB;AACrC,WAAOC;EACT;EAEA,OAAOC,kBAAkBC,MAAmBC,SAAsBC,WAAkC;AAClG,QAAI,CAACA,WAAW;AACd,aAAO;QAAC,IAAIR,MAAM,sBAAsBO,OAAAA,GAAU;;IACpD;AACA,QAAI,CAAC,IAAIE,aAAaC,aAAaH,OAAAA,CAAAA,EAAUI,OAAOL,MAAME,SAAAA,GAAY;AACpE,aAAO;QAAC,IAAIR,MAAM,sBAAsBO,OAAAA,MAAaC,SAAAA,GAAY;;IACnE;AACA,WAAO,CAAA;EACT;EAEAI,YAAqB;AACnB,UAAMC,SAAkB,CAAA;AAGxBA,WAAOC,KAAI,GAAI,KAAKC,oBAAmB,CAAA;AACvC,WAAOF;EACT;EAEAE,sBAA+B;AAC7B,UAAMF,SAAkB,CAAA;AACxB,UAAM,EAAED,UAAS,IAAK,KAAKI;AAC3B,UAAMC,gBAAgBC,KAAKN,SAAAA;AAC3B,QAAIA,WAAWb,WAAWkB,eAAelB,OAAQc,QAAOC,KAAK,IAAId,MAAM,0BAAA,CAAA;AACvE,WAAOa;EACT;EAEAM,iBAAiB;AACf,UAAMN,SAAkB,CAAA;AACxB,WAAOA;EACT;EAEAO,SAAkB;AAChB,UAAMP,SAAkB,CAAA;AACxB,QAAI,KAAKG,IAAII,WAAW,KAAKjB,gBAAgB;AAC3CU,aAAOC,KAAK,IAAId,MAAM,mBAAmB,KAAKG,cAAc,QAAQ,KAAKa,IAAII,MAAM,GAAG,CAAA;IACxF;AACA,WAAOP;EACT;EAEAQ,UAAmB;AACjB,UAAMR,SAAkB,CAAA;AACxB,UAAMS,UAAU,KAAKN,IAAIO;AACzB,QAAID,SAAS;AACX,YAAME,mBAAmBF,QAAQG,IAAI,CAACL,WAAAA;AACpC,eAAOlB,iBAAiBwB,6BAA6BN,MAAAA;MACvD,CAAA;AACA,iBAAWO,aAAaH,kBAAkB;AACxC,YAAIG,WAAW;AACbd,iBAAOC,KAAI,GAAIa,UAAUC,IAAG,CAAA;QAC9B;MACF;IACF;AACA,WAAOf;EACT;EAEA,MAAMgB,aAA+B;AACnC,WAAO;SACFlC,yBAAyB,KAAKqB,IAAIc,OAAOD,cAAc,CAAA,GAAI,KAAKb,IAAIJ,aAAa,CAAA,GAAI,oCAAA;UAEtF,MAAMmB,QAAQH,IACZ,KAAKZ,IAAIJ,WAAWa,IAAsB,OAAOlB,SAASyB,UACxD/B,uBAAsBI,kBACpBK,aAAa,MAAMuB,eAAeC,SAAS,KAAKC,OAAO,CAAA,GACvDzB,aAAaH,OAAAA,GACbG,aAAa,KAAKM,IAAIc,OAAOD,aAAaG,KAAAA,CAAM,CAAA,CAAA,KAE/C,CAAA,CAAE,GAETI,KAAI;;EAEV;EAEA,MAAeC,WAAW;AACxB,WAAO;SACD,MAAM,KAAKR,WAAU;SACtB,KAAKjB,UAAS;SACd,KAAK0B,qBAAoB;SACzB,KAAKjB,QAAO;SACZ,KAAKF,eAAc;SACnB,KAAKC,OAAM;SACV,MAAM,MAAMiB,SAAAA;;EAEpB;EAEAC,uBAAgC;AAC9B,UAAMzB,SAAkB,CAAA;AACxBA,WAAOC,KAAI,GAAI,KAAKyB,4BAA2B,CAAA;AAC/C,WAAO1B;EACT;EAEA0B,8BAAuC;AACrC,UAAM1B,SAAkB,CAAA;AACxBA,WAAOC,KAAI,GAAI,KAAK0B,oBAAoB,kBAAkB,iBAAA,CAAA;AAC1D,WAAO3B;EACT;EAEQ2B,oBAAoBC,WAAmBC,kBAAmC;AAChF,UAAM7B,SAAkB,CAAA;AAExB,UAAM,CAAC8B,OAAOC,WAAAA,IAAeC,aAAa,SAAS,KAAKC,aAAaL,SAAAA,GAAkB,IAAA;AACvF,UAAM,CAACM,cAAcC,kBAAAA,IAAsBH,aAAa,SAAS,KAAKC,aAAaJ,gBAAAA,GAAyB,IAAA;AAE5G,QAAIC,OAAO5C,WAAWgD,cAAchD,QAAQ;AAC1Cc,aAAOC,KAAK,IAAId,MAAM,GAAGyC,SAAAA,IAAaC,gBAAAA,oBAAoCC,OAAO5C,MAAAA,QAAcgD,cAAchD,MAAAA,GAAS,CAAA;IACxH;AAEA,WAAO;SAAI6C;SAAgBI;SAAuBnC;;EACpD;AACF;","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
@@ -1,2 +1,148 @@
1
- "use strict";var o=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var u=(i,s)=>o(i,"name",{value:s,configurable:!0});var j=(i,s)=>{for(var r in s)o(i,r,{get:s[r],enumerable:!0})},E=(i,s,r,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let e of b(s))!w.call(i,e)&&e!==r&&o(i,e,{get:()=>s[e],enumerable:!(t=$(s,e))||t.enumerable});return i};var L=i=>E(o({},"__esModule",{value:!0}),i);var x={};j(x,{BoundWitnessValidator:()=>d});module.exports=L(x);var h=require("@xylabs/arraybuffer"),g=require("@xylabs/lodash"),l=require("@xylabs/typeof"),p=require("@xyo-network/account"),y=require("@xyo-network/boundwitness-model"),f=require("@xyo-network/payload"),m=require("@xyo-network/payload-validator");var S=u((i,s,r="Array length mismatch")=>i.length==s.length?[]:[new Error(`${r} []`)],"validateArraysSameLength"),c=class c extends m.PayloadValidator{get expectedSchema(){return y.BoundWitnessSchema}static validateSignature(s,r,t){return t?new p.AddressValue((0,h.toUint8Array)(r)).verify(s,t)?[]:[new Error(`Invalid signature [${r}] [${t}]`)]:[new Error(`Missing signature [${r}]`)]}addresses(){let s=[];return s.push(...this.addressesUniqueness()),s}addressesUniqueness(){let s=[],{addresses:r}=this.obj,t=(0,g.uniq)(r);return(r==null?void 0:r.length)!==(t==null?void 0:t.length)&&s.push(new Error("addresses must be unique")),s}previousHashes(){return[]}schema(){let s=[];return this.obj.schema!==this.expectedSchema&&s.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),s}schemas(){let s=[],r=this.obj.payload_schemas;if(r){let t=r.map(e=>{var n,a;return(a=(n=m.PayloadValidator).schemaNameValidatorFactory)==null?void 0:a.call(n,e)});for(let e of t)e&&s.push(...e.all())}return s}async signatures(){var s,r;return[...S(((s=this.obj.$meta)==null?void 0:s.signatures)??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(((r=this.obj.addresses)==null?void 0:r.map(async(t,e)=>{var n,a;return c.validateSignature((0,h.toUint8Array)(await f.PayloadBuilder.dataHash(this.payload)),(0,h.toUint8Array)(t),(0,h.toUint8Array)((a=(n=this.obj.$meta)==null?void 0:n.signatures)==null?void 0:a[e]))}))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let s=[];return s.push(...this.validatePayloadHashesLength()),s}validatePayloadHashesLength(){let s=[];return s.push(...this.validateArrayLength("payload_hashes","payload_schemas")),s}validateArrayLength(s,r){let t=[],[e,n]=(0,l.validateType)("array",this.stringKeyObj[s],!0),[a,v]=(0,l.validateType)("array",this.stringKeyObj[r],!0);return(e==null?void 0:e.length)!==(a==null?void 0:a.length)&&t.push(new Error(`${s}/${r} count mismatch [${e==null?void 0:e.length} !== ${a==null?void 0:a.length}]`)),[...n,...v,...t]}};u(c,"BoundWitnessValidator");var d=c;0&&(module.exports={BoundWitnessValidator});
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ BoundWitnessValidator: () => BoundWitnessValidator
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/Validator.ts
29
+ var import_arraybuffer = require("@xylabs/arraybuffer");
30
+ var import_lodash = require("@xylabs/lodash");
31
+ var import_typeof = require("@xylabs/typeof");
32
+ var import_account = require("@xyo-network/account");
33
+ var import_boundwitness_model = require("@xyo-network/boundwitness-model");
34
+ var import_payload = require("@xyo-network/payload");
35
+ var import_payload_validator = require("@xyo-network/payload-validator");
36
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
37
+ return a.length == b.length ? [] : [
38
+ new Error(`${message} []`)
39
+ ];
40
+ }, "validateArraysSameLength");
41
+ var _BoundWitnessValidator = class _BoundWitnessValidator extends import_payload_validator.PayloadValidator {
42
+ get expectedSchema() {
43
+ return import_boundwitness_model.BoundWitnessSchema;
44
+ }
45
+ static validateSignature(hash, address, signature) {
46
+ if (!signature) {
47
+ return [
48
+ new Error(`Missing signature [${address}]`)
49
+ ];
50
+ }
51
+ if (!new import_account.AddressValue((0, import_arraybuffer.toUint8Array)(address)).verify(hash, signature)) {
52
+ return [
53
+ new Error(`Invalid signature [${address}] [${signature}]`)
54
+ ];
55
+ }
56
+ return [];
57
+ }
58
+ addresses() {
59
+ const errors = [];
60
+ errors.push(...this.addressesUniqueness());
61
+ return errors;
62
+ }
63
+ addressesUniqueness() {
64
+ const errors = [];
65
+ const { addresses } = this.obj;
66
+ const uniqAddresses = (0, import_lodash.uniq)(addresses);
67
+ if ((addresses == null ? void 0 : addresses.length) !== (uniqAddresses == null ? void 0 : uniqAddresses.length)) errors.push(new Error("addresses must be unique"));
68
+ return errors;
69
+ }
70
+ previousHashes() {
71
+ const errors = [];
72
+ return errors;
73
+ }
74
+ schema() {
75
+ const errors = [];
76
+ if (this.obj.schema !== this.expectedSchema) {
77
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
78
+ }
79
+ return errors;
80
+ }
81
+ schemas() {
82
+ const errors = [];
83
+ const Schemas = this.obj.payload_schemas;
84
+ if (Schemas) {
85
+ const schemaValidators = Schemas.map((schema) => {
86
+ var _a, _b;
87
+ return (_b = (_a = import_payload_validator.PayloadValidator).schemaNameValidatorFactory) == null ? void 0 : _b.call(_a, schema);
88
+ });
89
+ for (const validator of schemaValidators) {
90
+ if (validator) {
91
+ errors.push(...validator.all());
92
+ }
93
+ }
94
+ }
95
+ return errors;
96
+ }
97
+ async signatures() {
98
+ var _a, _b;
99
+ return [
100
+ ...validateArraysSameLength(((_a = this.obj.$meta) == null ? void 0 : _a.signatures) ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
101
+ ...(await Promise.all(((_b = this.obj.addresses) == null ? void 0 : _b.map(async (address, index) => {
102
+ var _a2, _b2;
103
+ return _BoundWitnessValidator.validateSignature((0, import_arraybuffer.toUint8Array)(await import_payload.PayloadBuilder.dataHash(this.payload)), (0, import_arraybuffer.toUint8Array)(address), (0, import_arraybuffer.toUint8Array)((_b2 = (_a2 = this.obj.$meta) == null ? void 0 : _a2.signatures) == null ? void 0 : _b2[index]));
104
+ })) ?? [])).flat()
105
+ ];
106
+ }
107
+ async validate() {
108
+ return [
109
+ ...await this.signatures(),
110
+ ...this.addresses(),
111
+ ...this.validateArrayLengths(),
112
+ ...this.schemas(),
113
+ ...this.previousHashes(),
114
+ ...this.schema(),
115
+ ...await super.validate()
116
+ ];
117
+ }
118
+ validateArrayLengths() {
119
+ const errors = [];
120
+ errors.push(...this.validatePayloadHashesLength());
121
+ return errors;
122
+ }
123
+ validatePayloadHashesLength() {
124
+ const errors = [];
125
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
126
+ return errors;
127
+ }
128
+ validateArrayLength(fieldName, compareArrayName) {
129
+ const errors = [];
130
+ const [array, arrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[fieldName], true);
131
+ const [compareArray, compareArrayErrors] = (0, import_typeof.validateType)("array", this.stringKeyObj[compareArrayName], true);
132
+ if ((array == null ? void 0 : array.length) !== (compareArray == null ? void 0 : compareArray.length)) {
133
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array == null ? void 0 : array.length} !== ${compareArray == null ? void 0 : compareArray.length}]`));
134
+ }
135
+ return [
136
+ ...arrayErrors,
137
+ ...compareArrayErrors,
138
+ ...errors
139
+ ];
140
+ }
141
+ };
142
+ __name(_BoundWitnessValidator, "BoundWitnessValidator");
143
+ var BoundWitnessValidator = _BoundWitnessValidator;
144
+ // Annotate the CommonJS export names for ESM import in node:
145
+ 0 && (module.exports = {
146
+ BoundWitnessValidator
147
+ });
2
148
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["src_exports","__export","BoundWitnessValidator","__toCommonJS","import_arraybuffer","import_lodash","import_typeof","import_account","import_boundwitness_model","import_payload","import_payload_validator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","_a","_b","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors","_BoundWitnessValidator"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Validator.ts"],"sourcesContent":["export * from './Validator'\n","import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","_a","_b","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
@@ -1,2 +1,123 @@
1
- var g=Object.defineProperty;var c=(o,s)=>g(o,"name",{value:s,configurable:!0});import{toUint8Array as n}from"@xylabs/arraybuffer";import{uniq as p}from"@xylabs/lodash";import{validateType as u}from"@xylabs/typeof";import{AddressValue as y}from"@xyo-network/account";import{BoundWitnessSchema as f}from"@xyo-network/boundwitness-model";import{PayloadBuilder as v}from"@xyo-network/payload";import{PayloadValidator as l}from"@xyo-network/payload-validator";var $=c((o,s,r="Array length mismatch")=>o.length==s.length?[]:[new Error(`${r} []`)],"validateArraysSameLength"),h=class h extends l{get expectedSchema(){return f}static validateSignature(s,r,e){return e?new y(n(r)).verify(s,e)?[]:[new Error(`Invalid signature [${r}] [${e}]`)]:[new Error(`Missing signature [${r}]`)]}addresses(){let s=[];return s.push(...this.addressesUniqueness()),s}addressesUniqueness(){let s=[],{addresses:r}=this.obj,e=p(r);return(r==null?void 0:r.length)!==(e==null?void 0:e.length)&&s.push(new Error("addresses must be unique")),s}previousHashes(){return[]}schema(){let s=[];return this.obj.schema!==this.expectedSchema&&s.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`)),s}schemas(){let s=[],r=this.obj.payload_schemas;if(r){let e=r.map(t=>{var i,a;return(a=(i=l).schemaNameValidatorFactory)==null?void 0:a.call(i,t)});for(let t of e)t&&s.push(...t.all())}return s}async signatures(){var s,r;return[...$(((s=this.obj.$meta)==null?void 0:s.signatures)??[],this.obj.addresses??[],"Length mismatch: address/signature"),...(await Promise.all(((r=this.obj.addresses)==null?void 0:r.map(async(e,t)=>{var i,a;return h.validateSignature(n(await v.dataHash(this.payload)),n(e),n((a=(i=this.obj.$meta)==null?void 0:i.signatures)==null?void 0:a[t]))}))??[])).flat()]}async validate(){return[...await this.signatures(),...this.addresses(),...this.validateArrayLengths(),...this.schemas(),...this.previousHashes(),...this.schema(),...await super.validate()]}validateArrayLengths(){let s=[];return s.push(...this.validatePayloadHashesLength()),s}validatePayloadHashesLength(){let s=[];return s.push(...this.validateArrayLength("payload_hashes","payload_schemas")),s}validateArrayLength(s,r){let e=[],[t,i]=u("array",this.stringKeyObj[s],!0),[a,d]=u("array",this.stringKeyObj[r],!0);return(t==null?void 0:t.length)!==(a==null?void 0:a.length)&&e.push(new Error(`${s}/${r} count mismatch [${t==null?void 0:t.length} !== ${a==null?void 0:a.length}]`)),[...i,...d,...e]}};c(h,"BoundWitnessValidator");var m=h;export{m as BoundWitnessValidator};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/Validator.ts
5
+ import { toUint8Array } from "@xylabs/arraybuffer";
6
+ import { uniq } from "@xylabs/lodash";
7
+ import { validateType } from "@xylabs/typeof";
8
+ import { AddressValue } from "@xyo-network/account";
9
+ import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
10
+ import { PayloadBuilder } from "@xyo-network/payload";
11
+ import { PayloadValidator } from "@xyo-network/payload-validator";
12
+ var validateArraysSameLength = /* @__PURE__ */ __name((a, b, message = "Array length mismatch") => {
13
+ return a.length == b.length ? [] : [
14
+ new Error(`${message} []`)
15
+ ];
16
+ }, "validateArraysSameLength");
17
+ var _BoundWitnessValidator = class _BoundWitnessValidator extends PayloadValidator {
18
+ get expectedSchema() {
19
+ return BoundWitnessSchema;
20
+ }
21
+ static validateSignature(hash, address, signature) {
22
+ if (!signature) {
23
+ return [
24
+ new Error(`Missing signature [${address}]`)
25
+ ];
26
+ }
27
+ if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {
28
+ return [
29
+ new Error(`Invalid signature [${address}] [${signature}]`)
30
+ ];
31
+ }
32
+ return [];
33
+ }
34
+ addresses() {
35
+ const errors = [];
36
+ errors.push(...this.addressesUniqueness());
37
+ return errors;
38
+ }
39
+ addressesUniqueness() {
40
+ const errors = [];
41
+ const { addresses } = this.obj;
42
+ const uniqAddresses = uniq(addresses);
43
+ if ((addresses == null ? void 0 : addresses.length) !== (uniqAddresses == null ? void 0 : uniqAddresses.length)) errors.push(new Error("addresses must be unique"));
44
+ return errors;
45
+ }
46
+ previousHashes() {
47
+ const errors = [];
48
+ return errors;
49
+ }
50
+ schema() {
51
+ const errors = [];
52
+ if (this.obj.schema !== this.expectedSchema) {
53
+ errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`));
54
+ }
55
+ return errors;
56
+ }
57
+ schemas() {
58
+ const errors = [];
59
+ const Schemas = this.obj.payload_schemas;
60
+ if (Schemas) {
61
+ const schemaValidators = Schemas.map((schema) => {
62
+ var _a, _b;
63
+ return (_b = (_a = PayloadValidator).schemaNameValidatorFactory) == null ? void 0 : _b.call(_a, schema);
64
+ });
65
+ for (const validator of schemaValidators) {
66
+ if (validator) {
67
+ errors.push(...validator.all());
68
+ }
69
+ }
70
+ }
71
+ return errors;
72
+ }
73
+ async signatures() {
74
+ var _a, _b;
75
+ return [
76
+ ...validateArraysSameLength(((_a = this.obj.$meta) == null ? void 0 : _a.signatures) ?? [], this.obj.addresses ?? [], "Length mismatch: address/signature"),
77
+ ...(await Promise.all(((_b = this.obj.addresses) == null ? void 0 : _b.map(async (address, index) => {
78
+ var _a2, _b2;
79
+ return _BoundWitnessValidator.validateSignature(toUint8Array(await PayloadBuilder.dataHash(this.payload)), toUint8Array(address), toUint8Array((_b2 = (_a2 = this.obj.$meta) == null ? void 0 : _a2.signatures) == null ? void 0 : _b2[index]));
80
+ })) ?? [])).flat()
81
+ ];
82
+ }
83
+ async validate() {
84
+ return [
85
+ ...await this.signatures(),
86
+ ...this.addresses(),
87
+ ...this.validateArrayLengths(),
88
+ ...this.schemas(),
89
+ ...this.previousHashes(),
90
+ ...this.schema(),
91
+ ...await super.validate()
92
+ ];
93
+ }
94
+ validateArrayLengths() {
95
+ const errors = [];
96
+ errors.push(...this.validatePayloadHashesLength());
97
+ return errors;
98
+ }
99
+ validatePayloadHashesLength() {
100
+ const errors = [];
101
+ errors.push(...this.validateArrayLength("payload_hashes", "payload_schemas"));
102
+ return errors;
103
+ }
104
+ validateArrayLength(fieldName, compareArrayName) {
105
+ const errors = [];
106
+ const [array, arrayErrors] = validateType("array", this.stringKeyObj[fieldName], true);
107
+ const [compareArray, compareArrayErrors] = validateType("array", this.stringKeyObj[compareArrayName], true);
108
+ if ((array == null ? void 0 : array.length) !== (compareArray == null ? void 0 : compareArray.length)) {
109
+ errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array == null ? void 0 : array.length} !== ${compareArray == null ? void 0 : compareArray.length}]`));
110
+ }
111
+ return [
112
+ ...arrayErrors,
113
+ ...compareArrayErrors,
114
+ ...errors
115
+ ];
116
+ }
117
+ };
118
+ __name(_BoundWitnessValidator, "BoundWitnessValidator");
119
+ var BoundWitnessValidator = _BoundWitnessValidator;
120
+ export {
121
+ BoundWitnessValidator
122
+ };
2
123
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","__name","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","_a","_b","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors","_BoundWitnessValidator"]}
1
+ {"version":3,"sources":["../../src/Validator.ts"],"sourcesContent":["import { toUint8Array } from '@xylabs/arraybuffer'\nimport { uniq } from '@xylabs/lodash'\nimport { validateType } from '@xylabs/typeof'\nimport { AddressValue } from '@xyo-network/account'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\n\nconst validateArraysSameLength = (a: unknown[], b: unknown[], message = 'Array length mismatch') => {\n return a.length == b.length ? [] : [new Error(`${message} []`)]\n}\n\nexport class BoundWitnessValidator<T extends BoundWitness<{ schema: string }> = BoundWitness> extends PayloadValidator<T> {\n protected get expectedSchema(): string {\n return BoundWitnessSchema\n }\n\n static validateSignature(hash: ArrayBuffer, address: ArrayBuffer, signature?: ArrayBuffer): Error[] {\n if (!signature) {\n return [new Error(`Missing signature [${address}]`)]\n }\n if (!new AddressValue(toUint8Array(address)).verify(hash, signature)) {\n return [new Error(`Invalid signature [${address}] [${signature}]`)]\n }\n return []\n }\n\n addresses(): Error[] {\n const errors: Error[] = []\n //const { addresses } = this.obj\n //if (!addresses?.length) errors.push(new Error('addresses missing [at least one address required]'))\n errors.push(...this.addressesUniqueness())\n return errors\n }\n\n addressesUniqueness(): Error[] {\n const errors: Error[] = []\n const { addresses } = this.obj\n const uniqAddresses = uniq(addresses)\n if (addresses?.length !== uniqAddresses?.length) errors.push(new Error('addresses must be unique'))\n return errors\n }\n\n previousHashes() {\n const errors: Error[] = []\n return errors\n }\n\n schema(): Error[] {\n const errors: Error[] = []\n if (this.obj.schema !== this.expectedSchema) {\n errors.push(new Error(`invalid schema [${this.expectedSchema} !== ${this.obj.schema}]`))\n }\n return errors\n }\n\n schemas(): Error[] {\n const errors: Error[] = []\n const Schemas = this.obj.payload_schemas\n if (Schemas) {\n const schemaValidators = Schemas.map((schema: string) => {\n return PayloadValidator.schemaNameValidatorFactory?.(schema)\n })\n for (const validator of schemaValidators) {\n if (validator) {\n errors.push(...validator.all())\n }\n }\n }\n return errors\n }\n\n async signatures(): Promise<Error[]> {\n return [\n ...validateArraysSameLength(this.obj.$meta?.signatures ?? [], this.obj.addresses ?? [], 'Length mismatch: address/signature'),\n ...(\n await Promise.all(\n this.obj.addresses?.map<Promise<Error[]>>(async (address, index) =>\n BoundWitnessValidator.validateSignature(\n toUint8Array(await PayloadBuilder.dataHash(this.payload)),\n toUint8Array(address),\n toUint8Array(this.obj.$meta?.signatures?.[index]),\n ),\n ) ?? [],\n )\n ).flat(),\n ]\n }\n\n override async validate() {\n return [\n ...(await this.signatures()),\n ...this.addresses(),\n ...this.validateArrayLengths(),\n ...this.schemas(),\n ...this.previousHashes(),\n ...this.schema(),\n ...(await super.validate()),\n ]\n }\n\n validateArrayLengths(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validatePayloadHashesLength())\n return errors\n }\n\n validatePayloadHashesLength(): Error[] {\n const errors: Error[] = []\n errors.push(...this.validateArrayLength('payload_hashes', 'payload_schemas'))\n return errors\n }\n\n private validateArrayLength(fieldName: string, compareArrayName: string): Error[] {\n const errors: Error[] = []\n\n const [array, arrayErrors] = validateType('array', this.stringKeyObj[fieldName] as [], true)\n const [compareArray, compareArrayErrors] = validateType('array', this.stringKeyObj[compareArrayName] as [], true)\n\n if (array?.length !== compareArray?.length) {\n errors.push(new Error(`${fieldName}/${compareArrayName} count mismatch [${array?.length} !== ${compareArray?.length}]`))\n }\n\n return [...arrayErrors, ...compareArrayErrors, ...errors]\n }\n}\n"],"mappings":"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","names":["toUint8Array","uniq","validateType","AddressValue","BoundWitnessSchema","PayloadBuilder","PayloadValidator","validateArraysSameLength","a","b","message","length","Error","BoundWitnessValidator","PayloadValidator","expectedSchema","BoundWitnessSchema","validateSignature","hash","address","signature","AddressValue","toUint8Array","verify","addresses","errors","push","addressesUniqueness","obj","uniqAddresses","uniq","previousHashes","schema","schemas","Schemas","payload_schemas","schemaValidators","map","schemaNameValidatorFactory","validator","all","signatures","$meta","Promise","index","_a","_b","PayloadBuilder","dataHash","payload","flat","validate","validateArrayLengths","validatePayloadHashesLength","validateArrayLength","fieldName","compareArrayName","array","arrayErrors","validateType","stringKeyObj","compareArray","compareArrayErrors"]}
package/package.json CHANGED
@@ -13,17 +13,17 @@
13
13
  "@xylabs/arraybuffer": "^3.5.1",
14
14
  "@xylabs/lodash": "^3.5.1",
15
15
  "@xylabs/typeof": "^3.5.1",
16
- "@xyo-network/account": "~2.107.3",
17
- "@xyo-network/boundwitness-model": "~2.107.3",
18
- "@xyo-network/payload": "~2.107.3",
19
- "@xyo-network/payload-validator": "~2.107.3"
16
+ "@xyo-network/account": "~2.107.4",
17
+ "@xyo-network/boundwitness-model": "~2.107.4",
18
+ "@xyo-network/payload": "~2.107.4",
19
+ "@xyo-network/payload-validator": "~2.107.4"
20
20
  },
21
21
  "description": "Primary SDK for using XYO Protocol 2.0",
22
22
  "devDependencies": {
23
- "@xylabs/ts-scripts-yarn3": "^3.11.9",
24
- "@xylabs/tsconfig": "^3.11.9",
25
- "@xyo-network/boundwitness-builder": "~2.107.3",
26
- "@xyo-network/schema-name-validator": "~2.107.3",
23
+ "@xylabs/ts-scripts-yarn3": "^3.11.10",
24
+ "@xylabs/tsconfig": "^3.11.10",
25
+ "@xyo-network/boundwitness-builder": "~2.107.4",
26
+ "@xyo-network/schema-name-validator": "~2.107.4",
27
27
  "typescript": "^5.5.2"
28
28
  },
29
29
  "exports": {
@@ -64,6 +64,6 @@
64
64
  },
65
65
  "sideEffects": false,
66
66
  "types": "dist/node/index.d.ts",
67
- "version": "2.107.3",
67
+ "version": "2.107.4",
68
68
  "type": "module"
69
69
  }