@xyo-network/boundwitness-builder 2.62.1 → 2.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Builder.js +26 -20
- package/dist/cjs/Builder.js.map +1 -1
- package/dist/docs.json +285 -215
- package/dist/esm/Builder.js +28 -22
- package/dist/esm/Builder.js.map +1 -1
- package/dist/types/Builder.d.ts +3 -1
- package/dist/types/Builder.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/Builder.ts +33 -23
package/dist/esm/Builder.js
CHANGED
|
@@ -4,9 +4,11 @@ import { BoundWitnessSchema } from '@xyo-network/boundwitness-model';
|
|
|
4
4
|
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper';
|
|
5
5
|
import { PayloadHasher, sortFields } from '@xyo-network/core';
|
|
6
6
|
import { PayloadWrapper } from '@xyo-network/payload';
|
|
7
|
+
import { Mutex } from 'async-mutex';
|
|
7
8
|
export class BoundWitnessBuilder {
|
|
8
9
|
config;
|
|
9
10
|
logger;
|
|
11
|
+
static _buildMutex = new Mutex();
|
|
10
12
|
_accounts = [];
|
|
11
13
|
_payloadHashes;
|
|
12
14
|
_payloadSchemas;
|
|
@@ -23,26 +25,30 @@ export class BoundWitnessBuilder {
|
|
|
23
25
|
}));
|
|
24
26
|
}
|
|
25
27
|
async build(meta = false) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
28
|
+
return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
29
|
+
const hashableFields = await this.hashableFields();
|
|
30
|
+
const _hash = await BoundWitnessWrapper.hashAsync(hashableFields);
|
|
31
|
+
/* get all the previousHashes to verify atomic signing */
|
|
32
|
+
const previousHashes = this._accounts.map((account) => account.previousHash?.hex);
|
|
33
|
+
const ret = {
|
|
34
|
+
...hashableFields,
|
|
35
|
+
_signatures: await this.signatures(_hash, previousHashes),
|
|
36
|
+
};
|
|
37
|
+
if (meta ?? this.config?.meta) {
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
const bwWithMeta = ret;
|
|
40
|
+
bwWithMeta._client = 'js';
|
|
41
|
+
bwWithMeta._hash = _hash;
|
|
42
|
+
bwWithMeta._timestamp = this._timestamp;
|
|
43
|
+
}
|
|
44
|
+
if (this.config.inlinePayloads) {
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
const anyRet = ret;
|
|
47
|
+
//leaving this in here to prevent breaking code (for now)
|
|
48
|
+
anyRet._payloads = this.inlinePayloads();
|
|
49
|
+
}
|
|
50
|
+
return [ret, this._payloads];
|
|
51
|
+
});
|
|
46
52
|
}
|
|
47
53
|
async hashableFields() {
|
|
48
54
|
const addresses = this._accounts.map((account) => account.addressValue.hex);
|
|
@@ -94,9 +100,9 @@ export class BoundWitnessBuilder {
|
|
|
94
100
|
this._accounts?.push(...accounts);
|
|
95
101
|
return this;
|
|
96
102
|
}
|
|
97
|
-
async signatures(_hash) {
|
|
103
|
+
async signatures(_hash, previousHashes) {
|
|
98
104
|
const hash = Buffer.from(_hash, 'hex');
|
|
99
|
-
return await Promise.all(this._accounts.map(async (account) => Buffer.from(await account.sign(hash)).toString('hex')));
|
|
105
|
+
return await Promise.all(this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')));
|
|
100
106
|
}
|
|
101
107
|
async getPayloadHashes() {
|
|
102
108
|
return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))));
|
package/dist/esm/Builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAQ,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AASnC,MAAM,OAAO,mBAAmB;IAQT;IAAkF;IAP/F,MAAM,CAAU,WAAW,GAAG,IAAI,KAAK,EAAE,CAAA;IACzC,SAAS,GAAsB,EAAE,CAAA;IACjC,cAAc,CAAsB;IACpC,eAAe,CAAsB;IACrC,SAAS,GAAe,EAAE,CAAA;IAC1B,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAE/B,YAAqB,SAAoC,EAAE,cAAc,EAAE,KAAK,EAAE,EAAqB,MAAe;QAAjG,WAAM,GAAN,MAAM,CAAuD;QAAqB,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAE1H,IAAY,gBAAgB;QAC1B,OAAO,CACL,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAA;YAC3E,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;QACtB,OAAO,MAAM,mBAAmB,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACnE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;YAClD,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;YAEjE,yDAAyD;YACzD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;YAEjF,MAAM,GAAG,GAAkB;gBACzB,GAAG,cAAc;gBACjB,WAAW,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC;aAC1D,CAAA;YACD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC7B,8DAA8D;gBAC9D,MAAM,UAAU,GAAG,GAAU,CAAA;gBAC7B,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;gBACzB,UAAU,CAAC,KAAK,GAAG,KAAK,CAAA;gBACxB,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;aACxC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;gBAC9B,8DAA8D;gBAC9D,MAAM,MAAM,GAAG,GAAU,CAAA;gBACzB,yDAAyD;gBACzD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;aACzC;YACD,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC3E,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,IAAI,CAAC,CAAA;QAC1F,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,wBAAwB,CAAC,CAAA;QACxF,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,yBAAyB,CAAC,CAAA;QAClF,MAAM,MAAM,GAAkB;YAC5B,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;YACnD,cAAc;YACd,eAAe;YACf,eAAe;YACf,MAAM,EAAE,kBAAkB;SACV,CAAA;QAElB,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,KAAK,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,8BAA8B,CAAC,CAAA;QAE1G,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,uBAAuB,CAAC,CAAA;QAE5G,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAA;QAElH,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE;YACjC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAA;SACnC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,CAAC,MAAgB,EAAE,MAAgB;QACvC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,8CAA8C,CAAC,CAAA;QACpF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAA;QAC5B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,OAAkB;QACxB,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAW,OAAO,CAAC,CAAA;QACjE,QAAQ,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,8CAA8C,CAAC,CAAA;QAC3F,IAAI,gBAAgB,EAAE;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAW,gBAAgB,CAAC,CAAC,CAAC,CAAA;SACtE;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,QAAQ,CAAC,QAA8B;QACrC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,OAAO,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;aACtB;QACH,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,OAAwB;QAC9B,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,QAA2B;QACnC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;QACjC,OAAO,IAAI,CAAA;IACb,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,cAA6C;QACrF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACtC,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC3H,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,OAAO,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IACtH,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACrD,OAAO;gBACL,GAAG,OAAO;gBACV,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;aACrC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,oBAAoB,CAAC,OAAgB;QAC3C,OAAO,4BAA4B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;IACvE,CAAC"}
|
package/dist/types/Builder.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
2
2
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
3
|
+
import { Data } from '@xyo-network/core';
|
|
3
4
|
import { Payload } from '@xyo-network/payload-model';
|
|
4
5
|
import { Logger } from '@xyo-network/shared';
|
|
5
6
|
export interface BoundWitnessBuilderConfig {
|
|
@@ -13,6 +14,7 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
13
14
|
}> = BoundWitness, TPayload extends Payload = Payload> {
|
|
14
15
|
readonly config: BoundWitnessBuilderConfig;
|
|
15
16
|
protected readonly logger?: Logger | undefined;
|
|
17
|
+
private static readonly _buildMutex;
|
|
16
18
|
private _accounts;
|
|
17
19
|
private _payloadHashes;
|
|
18
20
|
private _payloadSchemas;
|
|
@@ -27,7 +29,7 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
27
29
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
28
30
|
witness(account: AccountInstance): this;
|
|
29
31
|
witnesses(accounts: AccountInstance[]): this;
|
|
30
|
-
protected signatures(_hash: string): Promise<string[]>;
|
|
32
|
+
protected signatures(_hash: string, previousHashes: (string | Data | undefined)[]): Promise<string[]>;
|
|
31
33
|
private getPayloadHashes;
|
|
32
34
|
private inlinePayloads;
|
|
33
35
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAElF,OAAO,EAAE,IAAI,EAA6B,MAAM,mBAAmB,CAAA;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAG5C,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAQ5H,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAA8B,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP9G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,UAAU,CAAa;gBAEV,MAAM,GAAE,yBAAqD,EAAqB,MAAM,CAAC,oBAAQ;IAEtH,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;IA6BzD,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA0B9C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAOzC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE;YAOzE,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,oBAAoB;CAG7B"}
|
package/package.json
CHANGED
|
@@ -12,18 +12,19 @@
|
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@xylabs/assert": "^2.9.1",
|
|
14
14
|
"@xylabs/buffer": "^2.9.1",
|
|
15
|
-
"@xyo-network/account-model": "^2.
|
|
16
|
-
"@xyo-network/boundwitness-model": "^2.
|
|
17
|
-
"@xyo-network/boundwitness-wrapper": "^2.
|
|
18
|
-
"@xyo-network/core": "^2.
|
|
19
|
-
"@xyo-network/payload": "^2.
|
|
20
|
-
"@xyo-network/payload-model": "^2.
|
|
21
|
-
"@xyo-network/shared": "^2.
|
|
15
|
+
"@xyo-network/account-model": "^2.63.0",
|
|
16
|
+
"@xyo-network/boundwitness-model": "^2.63.0",
|
|
17
|
+
"@xyo-network/boundwitness-wrapper": "^2.63.0",
|
|
18
|
+
"@xyo-network/core": "^2.63.0",
|
|
19
|
+
"@xyo-network/payload": "^2.63.0",
|
|
20
|
+
"@xyo-network/payload-model": "^2.63.0",
|
|
21
|
+
"@xyo-network/shared": "^2.63.0",
|
|
22
|
+
"async-mutex": "^0.4.0"
|
|
22
23
|
},
|
|
23
24
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@xylabs/ts-scripts-yarn3": "^2.17.
|
|
26
|
-
"@xylabs/tsconfig": "^2.17.
|
|
26
|
+
"@xylabs/ts-scripts-yarn3": "^2.17.17",
|
|
27
|
+
"@xylabs/tsconfig": "^2.17.17",
|
|
27
28
|
"typescript": "^5.1.3"
|
|
28
29
|
},
|
|
29
30
|
"browser": "dist/esm/index.js",
|
|
@@ -58,5 +59,5 @@
|
|
|
58
59
|
},
|
|
59
60
|
"sideEffects": false,
|
|
60
61
|
"types": "dist/types/index.d.ts",
|
|
61
|
-
"version": "2.
|
|
62
|
+
"version": "2.63.0"
|
|
62
63
|
}
|
package/src/Builder.ts
CHANGED
|
@@ -3,10 +3,11 @@ import { Buffer } from '@xylabs/buffer'
|
|
|
3
3
|
import { AccountInstance } from '@xyo-network/account-model'
|
|
4
4
|
import { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'
|
|
5
5
|
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
|
|
6
|
-
import { PayloadHasher, sortFields } from '@xyo-network/core'
|
|
6
|
+
import { Data, PayloadHasher, sortFields } from '@xyo-network/core'
|
|
7
7
|
import { PayloadWrapper } from '@xyo-network/payload'
|
|
8
8
|
import { Payload } from '@xyo-network/payload-model'
|
|
9
9
|
import { Logger } from '@xyo-network/shared'
|
|
10
|
+
import { Mutex } from 'async-mutex'
|
|
10
11
|
|
|
11
12
|
export interface BoundWitnessBuilderConfig {
|
|
12
13
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -16,6 +17,7 @@ export interface BoundWitnessBuilderConfig {
|
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {
|
|
20
|
+
private static readonly _buildMutex = new Mutex()
|
|
19
21
|
private _accounts: AccountInstance[] = []
|
|
20
22
|
private _payloadHashes: string[] | undefined
|
|
21
23
|
private _payloadSchemas: string[] | undefined
|
|
@@ -34,26 +36,32 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
34
36
|
}
|
|
35
37
|
|
|
36
38
|
async build(meta = false): Promise<[TBoundWitness, TPayload[]]> {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
39
|
+
return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
40
|
+
const hashableFields = await this.hashableFields()
|
|
41
|
+
const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)
|
|
42
|
+
|
|
43
|
+
/* get all the previousHashes to verify atomic signing */
|
|
44
|
+
const previousHashes = this._accounts.map((account) => account.previousHash?.hex)
|
|
45
|
+
|
|
46
|
+
const ret: TBoundWitness = {
|
|
47
|
+
...hashableFields,
|
|
48
|
+
_signatures: await this.signatures(_hash, previousHashes),
|
|
49
|
+
}
|
|
50
|
+
if (meta ?? this.config?.meta) {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const bwWithMeta = ret as any
|
|
53
|
+
bwWithMeta._client = 'js'
|
|
54
|
+
bwWithMeta._hash = _hash
|
|
55
|
+
bwWithMeta._timestamp = this._timestamp
|
|
56
|
+
}
|
|
57
|
+
if (this.config.inlinePayloads) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
const anyRet = ret as any
|
|
60
|
+
//leaving this in here to prevent breaking code (for now)
|
|
61
|
+
anyRet._payloads = this.inlinePayloads()
|
|
62
|
+
}
|
|
63
|
+
return [ret, this._payloads]
|
|
64
|
+
})
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
async hashableFields(): Promise<TBoundWitness> {
|
|
@@ -117,9 +125,11 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
117
125
|
return this
|
|
118
126
|
}
|
|
119
127
|
|
|
120
|
-
protected async signatures(_hash: string) {
|
|
128
|
+
protected async signatures(_hash: string, previousHashes: (string | Data | undefined)[]) {
|
|
121
129
|
const hash = Buffer.from(_hash, 'hex')
|
|
122
|
-
return await Promise.all(
|
|
130
|
+
return await Promise.all(
|
|
131
|
+
this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),
|
|
132
|
+
)
|
|
123
133
|
}
|
|
124
134
|
|
|
125
135
|
private async getPayloadHashes(): Promise<string[]> {
|