@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.
@@ -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
- const hashableFields = await this.hashableFields();
27
- const _hash = await BoundWitnessWrapper.hashAsync(hashableFields);
28
- const ret = {
29
- ...hashableFields,
30
- _signatures: await this.signatures(_hash),
31
- };
32
- if (meta ?? this.config?.meta) {
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- const bwWithMeta = ret;
35
- bwWithMeta._client = 'js';
36
- bwWithMeta._hash = _hash;
37
- bwWithMeta._timestamp = this._timestamp;
38
- }
39
- if (this.config.inlinePayloads) {
40
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
- const anyRet = ret;
42
- //leaving this in here to prevent breaking code (for now)
43
- anyRet._payloads = this.inlinePayloads();
44
- }
45
- return [ret, this._payloads];
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))));
@@ -1 +1 @@
1
- {"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Builder.js","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
@@ -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;AAIlF,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,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;IAO5H,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAA8B,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAN9G,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;IAuBzD,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;YAK1B,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,oBAAoB;CAG7B"}
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.62.1",
16
- "@xyo-network/boundwitness-model": "^2.62.1",
17
- "@xyo-network/boundwitness-wrapper": "^2.62.1",
18
- "@xyo-network/core": "^2.62.1",
19
- "@xyo-network/payload": "^2.62.1",
20
- "@xyo-network/payload-model": "^2.62.1",
21
- "@xyo-network/shared": "^2.62.1"
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.13",
26
- "@xylabs/tsconfig": "^2.17.13",
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.1"
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
- const hashableFields = await this.hashableFields()
38
- const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)
39
- const ret: TBoundWitness = {
40
- ...hashableFields,
41
- _signatures: await this.signatures(_hash),
42
- }
43
- if (meta ?? this.config?.meta) {
44
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
- const bwWithMeta = ret as any
46
- bwWithMeta._client = 'js'
47
- bwWithMeta._hash = _hash
48
- bwWithMeta._timestamp = this._timestamp
49
- }
50
- if (this.config.inlinePayloads) {
51
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
- const anyRet = ret as any
53
- //leaving this in here to prevent breaking code (for now)
54
- anyRet._payloads = this.inlinePayloads()
55
- }
56
- return [ret, this._payloads]
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(this._accounts.map(async (account) => Buffer.from(await account.sign(hash)).toString('hex')))
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[]> {