@xyo-network/boundwitness-builder 4.3.0 → 5.0.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.
Files changed (55) hide show
  1. package/dist/browser/{Builder.d.ts → BoundWitnessBuilder.d.ts} +2 -3
  2. package/dist/browser/BoundWitnessBuilder.d.ts.map +1 -0
  3. package/dist/browser/GeneratedBoundWitnessFields.d.ts +3 -0
  4. package/dist/browser/GeneratedBoundWitnessFields.d.ts.map +1 -0
  5. package/dist/browser/Query/QueryBoundWitnessBuilder.d.ts +1 -1
  6. package/dist/browser/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
  7. package/dist/browser/index.d.ts +1 -1
  8. package/dist/browser/index.d.ts.map +1 -1
  9. package/dist/browser/index.mjs +19 -9
  10. package/dist/browser/index.mjs.map +1 -1
  11. package/dist/browser/uniqueAccounts.d.ts +3 -0
  12. package/dist/browser/uniqueAccounts.d.ts.map +1 -0
  13. package/dist/browser/uniqueAddresses.d.ts +3 -0
  14. package/dist/browser/uniqueAddresses.d.ts.map +1 -0
  15. package/dist/{node/Builder.d.ts → neutral/BoundWitnessBuilder.d.ts} +2 -3
  16. package/dist/neutral/BoundWitnessBuilder.d.ts.map +1 -0
  17. package/dist/neutral/GeneratedBoundWitnessFields.d.ts +3 -0
  18. package/dist/neutral/GeneratedBoundWitnessFields.d.ts.map +1 -0
  19. package/dist/neutral/Query/QueryBoundWitnessBuilder.d.ts +1 -1
  20. package/dist/neutral/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
  21. package/dist/neutral/index.d.ts +1 -1
  22. package/dist/neutral/index.d.ts.map +1 -1
  23. package/dist/neutral/index.mjs +19 -9
  24. package/dist/neutral/index.mjs.map +1 -1
  25. package/dist/neutral/uniqueAccounts.d.ts +3 -0
  26. package/dist/neutral/uniqueAccounts.d.ts.map +1 -0
  27. package/dist/neutral/uniqueAddresses.d.ts +3 -0
  28. package/dist/neutral/uniqueAddresses.d.ts.map +1 -0
  29. package/dist/{neutral/Builder.d.ts → node/BoundWitnessBuilder.d.ts} +2 -3
  30. package/dist/node/BoundWitnessBuilder.d.ts.map +1 -0
  31. package/dist/node/GeneratedBoundWitnessFields.d.ts +3 -0
  32. package/dist/node/GeneratedBoundWitnessFields.d.ts.map +1 -0
  33. package/dist/node/Query/QueryBoundWitnessBuilder.d.ts +1 -1
  34. package/dist/node/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
  35. package/dist/node/index.d.ts +1 -1
  36. package/dist/node/index.d.ts.map +1 -1
  37. package/dist/node/index.mjs +19 -9
  38. package/dist/node/index.mjs.map +1 -1
  39. package/dist/node/uniqueAccounts.d.ts +3 -0
  40. package/dist/node/uniqueAccounts.d.ts.map +1 -0
  41. package/dist/node/uniqueAddresses.d.ts +3 -0
  42. package/dist/node/uniqueAddresses.d.ts.map +1 -0
  43. package/package.json +20 -16
  44. package/src/{Builder.ts → BoundWitnessBuilder.ts} +4 -18
  45. package/src/GeneratedBoundWitnessFields.ts +2 -0
  46. package/src/Query/QueryBoundWitnessBuilder.ts +1 -1
  47. package/src/index.ts +1 -1
  48. package/src/spec/Builder.perf.spec.ts +31 -0
  49. package/src/spec/Builder.sequence.spec.ts +175 -0
  50. package/src/spec/Builder.spec.ts +85 -0
  51. package/src/uniqueAccounts.ts +7 -0
  52. package/src/uniqueAddresses.ts +15 -0
  53. package/dist/browser/Builder.d.ts.map +0 -1
  54. package/dist/neutral/Builder.d.ts.map +0 -1
  55. package/dist/node/Builder.d.ts.map +0 -1
@@ -4,8 +4,7 @@ import type { BoundWitness, Signed, UnsignedBoundWitness } from '@xyo-network/bo
4
4
  import type { PayloadBuilderOptions } from '@xyo-network/payload-builder';
5
5
  import { PayloadBuilder } from '@xyo-network/payload-builder';
6
6
  import type { ModuleError, Payload, Schema, WithoutClientMeta, WithoutMeta, WithoutSchema, WithoutStorageMeta } from '@xyo-network/payload-model';
7
- export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
8
- export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
7
+ import { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts';
9
8
  export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness, TPayload extends Payload = Payload> extends PayloadBuilder<TBoundWitness, Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>> {
10
9
  private static readonly _buildMutex;
11
10
  private _accounts;
@@ -45,4 +44,4 @@ export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitn
45
44
  private generatedFields;
46
45
  private missingSchemaMessage;
47
46
  }
48
- //# sourceMappingURL=Builder.d.ts.map
47
+ //# sourceMappingURL=BoundWitnessBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../src/BoundWitnessBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
2
+ export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
3
+ //# sourceMappingURL=GeneratedBoundWitnessFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneratedBoundWitnessFields.d.ts","sourceRoot":"","sources":["../../src/GeneratedBoundWitnessFields.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,gFAAiF,CAAA;AACzH,MAAM,MAAM,2BAA2B,GAAG,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { QueryBoundWitness } from '@xyo-network/boundwitness-model';
2
2
  import type { Query, WithoutMeta } from '@xyo-network/payload-model';
3
- import { BoundWitnessBuilder } from '../Builder.ts';
3
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts';
4
4
  export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
5
5
  private _query;
6
6
  dataHashableFields(): Promise<WithoutMeta<TBoundWitness>>;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAEnD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
1
+ {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
@@ -1,3 +1,3 @@
1
- export * from './Builder.ts';
1
+ export * from './BoundWitnessBuilder.ts';
2
2
  export * from './Query/index.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA"}
@@ -1,4 +1,4 @@
1
- // src/Builder.ts
1
+ // src/BoundWitnessBuilder.ts
2
2
  import { toArrayBuffer } from "@xylabs/arraybuffer";
3
3
  import { assertEx } from "@xylabs/assert";
4
4
  import {
@@ -14,20 +14,31 @@ import {
14
14
  } from "@xyo-network/hash";
15
15
  import { omitSchema, PayloadBuilder } from "@xyo-network/payload-builder";
16
16
  import { Mutex } from "async-mutex";
17
+
18
+ // src/GeneratedBoundWitnessFields.ts
17
19
  var GeneratedBoundWitnessFields = ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
18
- var uniqueAccounts = (accounts, throwOnFalse = false) => {
19
- const addresses = /* @__PURE__ */ new Set();
20
- for (const account of accounts) {
21
- if (addresses.has(account.address)) {
20
+
21
+ // src/uniqueAddresses.ts
22
+ var uniqueAddresses = (addresses, throwOnFalse = false) => {
23
+ const addressesSet = /* @__PURE__ */ new Set();
24
+ for (const address of addresses) {
25
+ if (addressesSet.has(address)) {
22
26
  if (throwOnFalse) {
23
27
  throw new Error("Duplicate address");
24
28
  }
25
29
  return false;
26
30
  }
27
- addresses.add(account.address);
31
+ addressesSet.add(address);
28
32
  }
29
33
  return true;
30
34
  };
35
+
36
+ // src/uniqueAccounts.ts
37
+ var uniqueAccounts = (accounts, throwOnFalse = false) => {
38
+ return uniqueAddresses(accounts.map((account) => account.address), throwOnFalse);
39
+ };
40
+
41
+ // src/BoundWitnessBuilder.ts
31
42
  var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
32
43
  static _buildMutex = new Mutex();
33
44
  _accounts = [];
@@ -86,8 +97,8 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
86
97
  }
87
98
  static validateGeneratedFields(fields) {
88
99
  assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => "Payload hash/schema mismatch");
89
- assertEx(!fields.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
90
- assertEx(!fields.payload_schemas.some((schema) => !schema), () => "nulls found in schemas");
100
+ assertEx(!fields.payload_hashes.includes(null), () => "nulls found in hashes");
101
+ assertEx(!fields.payload_schemas.includes(null), () => "nulls found in schemas");
91
102
  }
92
103
  async build() {
93
104
  return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
@@ -232,7 +243,6 @@ var QueryBoundWitnessBuilder = class extends BoundWitnessBuilder {
232
243
  };
233
244
  export {
234
245
  BoundWitnessBuilder,
235
- GeneratedBoundWitnessFields,
236
246
  QueryBoundWitnessBuilder
237
247
  };
238
248
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n\nconst uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n const addresses = new Set<Address>()\n for (const account of accounts) {\n if (addresses.has(account.address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addresses.add(account.address)\n }\n return true\n}\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!fields.payload_hashes.some(hash => !hash), () => 'nulls found in hashes')\n assertEx(!fields.payload_schemas.some(schema => !schema), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../Builder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
1
+ {"version":3,"sources":["../../src/BoundWitnessBuilder.ts","../../src/GeneratedBoundWitnessFields.ts","../../src/uniqueAddresses.ts","../../src/uniqueAccounts.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nimport { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts'\nimport { uniqueAccounts } from './uniqueAccounts.ts'\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!(fields.payload_hashes as (Hash | null)[]).includes(null), () => 'nulls found in hashes')\n assertEx(!(fields.payload_schemas as (Schema | null)[]).includes(null), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n","import type { Address } from '@xylabs/hex'\n\nexport const uniqueAddresses = (addresses: Address[], throwOnFalse = false) => {\n const addressesSet = new Set<Address>()\n for (const address of addresses) {\n if (addressesSet.has(address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addressesSet.add(address)\n }\n return true\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\n\nimport { uniqueAddresses } from './uniqueAddresses.ts'\n\nexport const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n return uniqueAddresses(accounts.map(account => account.address), throwOnFalse)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
@@ -0,0 +1,3 @@
1
+ import type { AccountInstance } from '@xyo-network/account-model';
2
+ export declare const uniqueAccounts: (accounts: AccountInstance[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAccounts.d.ts","sourceRoot":"","sources":["../../src/uniqueAccounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAIjE,eAAO,MAAM,cAAc,GAAI,UAAU,eAAe,EAAE,EAAE,sBAAoB,YAE/E,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Address } from '@xylabs/hex';
2
+ export declare const uniqueAddresses: (addresses: Address[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAddresses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAddresses.d.ts","sourceRoot":"","sources":["../../src/uniqueAddresses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,eAAe,GAAI,WAAW,OAAO,EAAE,EAAE,sBAAoB,YAYzE,CAAA"}
@@ -4,8 +4,7 @@ import type { BoundWitness, Signed, UnsignedBoundWitness } from '@xyo-network/bo
4
4
  import type { PayloadBuilderOptions } from '@xyo-network/payload-builder';
5
5
  import { PayloadBuilder } from '@xyo-network/payload-builder';
6
6
  import type { ModuleError, Payload, Schema, WithoutClientMeta, WithoutMeta, WithoutSchema, WithoutStorageMeta } from '@xyo-network/payload-model';
7
- export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
8
- export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
7
+ import { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts';
9
8
  export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness, TPayload extends Payload = Payload> extends PayloadBuilder<TBoundWitness, Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>> {
10
9
  private static readonly _buildMutex;
11
10
  private _accounts;
@@ -45,4 +44,4 @@ export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitn
45
44
  private generatedFields;
46
45
  private missingSchemaMessage;
47
46
  }
48
- //# sourceMappingURL=Builder.d.ts.map
47
+ //# sourceMappingURL=BoundWitnessBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../src/BoundWitnessBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
2
+ export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
3
+ //# sourceMappingURL=GeneratedBoundWitnessFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneratedBoundWitnessFields.d.ts","sourceRoot":"","sources":["../../src/GeneratedBoundWitnessFields.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,gFAAiF,CAAA;AACzH,MAAM,MAAM,2BAA2B,GAAG,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { QueryBoundWitness } from '@xyo-network/boundwitness-model';
2
2
  import type { Query, WithoutMeta } from '@xyo-network/payload-model';
3
- import { BoundWitnessBuilder } from '../Builder.ts';
3
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts';
4
4
  export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
5
5
  private _query;
6
6
  dataHashableFields(): Promise<WithoutMeta<TBoundWitness>>;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAEnD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
1
+ {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
@@ -1,3 +1,3 @@
1
- export * from './Builder.ts';
1
+ export * from './BoundWitnessBuilder.ts';
2
2
  export * from './Query/index.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA"}
@@ -1,4 +1,4 @@
1
- // src/Builder.ts
1
+ // src/BoundWitnessBuilder.ts
2
2
  import { toArrayBuffer } from "@xylabs/arraybuffer";
3
3
  import { assertEx } from "@xylabs/assert";
4
4
  import {
@@ -14,20 +14,31 @@ import {
14
14
  } from "@xyo-network/hash";
15
15
  import { omitSchema, PayloadBuilder } from "@xyo-network/payload-builder";
16
16
  import { Mutex } from "async-mutex";
17
+
18
+ // src/GeneratedBoundWitnessFields.ts
17
19
  var GeneratedBoundWitnessFields = ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
18
- var uniqueAccounts = (accounts, throwOnFalse = false) => {
19
- const addresses = /* @__PURE__ */ new Set();
20
- for (const account of accounts) {
21
- if (addresses.has(account.address)) {
20
+
21
+ // src/uniqueAddresses.ts
22
+ var uniqueAddresses = (addresses, throwOnFalse = false) => {
23
+ const addressesSet = /* @__PURE__ */ new Set();
24
+ for (const address of addresses) {
25
+ if (addressesSet.has(address)) {
22
26
  if (throwOnFalse) {
23
27
  throw new Error("Duplicate address");
24
28
  }
25
29
  return false;
26
30
  }
27
- addresses.add(account.address);
31
+ addressesSet.add(address);
28
32
  }
29
33
  return true;
30
34
  };
35
+
36
+ // src/uniqueAccounts.ts
37
+ var uniqueAccounts = (accounts, throwOnFalse = false) => {
38
+ return uniqueAddresses(accounts.map((account) => account.address), throwOnFalse);
39
+ };
40
+
41
+ // src/BoundWitnessBuilder.ts
31
42
  var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
32
43
  static _buildMutex = new Mutex();
33
44
  _accounts = [];
@@ -86,8 +97,8 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
86
97
  }
87
98
  static validateGeneratedFields(fields) {
88
99
  assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => "Payload hash/schema mismatch");
89
- assertEx(!fields.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
90
- assertEx(!fields.payload_schemas.some((schema) => !schema), () => "nulls found in schemas");
100
+ assertEx(!fields.payload_hashes.includes(null), () => "nulls found in hashes");
101
+ assertEx(!fields.payload_schemas.includes(null), () => "nulls found in schemas");
91
102
  }
92
103
  async build() {
93
104
  return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
@@ -232,7 +243,6 @@ var QueryBoundWitnessBuilder = class extends BoundWitnessBuilder {
232
243
  };
233
244
  export {
234
245
  BoundWitnessBuilder,
235
- GeneratedBoundWitnessFields,
236
246
  QueryBoundWitnessBuilder
237
247
  };
238
248
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n\nconst uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n const addresses = new Set<Address>()\n for (const account of accounts) {\n if (addresses.has(account.address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addresses.add(account.address)\n }\n return true\n}\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!fields.payload_hashes.some(hash => !hash), () => 'nulls found in hashes')\n assertEx(!fields.payload_schemas.some(schema => !schema), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../Builder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
1
+ {"version":3,"sources":["../../src/BoundWitnessBuilder.ts","../../src/GeneratedBoundWitnessFields.ts","../../src/uniqueAddresses.ts","../../src/uniqueAccounts.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nimport { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts'\nimport { uniqueAccounts } from './uniqueAccounts.ts'\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!(fields.payload_hashes as (Hash | null)[]).includes(null), () => 'nulls found in hashes')\n assertEx(!(fields.payload_schemas as (Schema | null)[]).includes(null), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n","import type { Address } from '@xylabs/hex'\n\nexport const uniqueAddresses = (addresses: Address[], throwOnFalse = false) => {\n const addressesSet = new Set<Address>()\n for (const address of addresses) {\n if (addressesSet.has(address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addressesSet.add(address)\n }\n return true\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\n\nimport { uniqueAddresses } from './uniqueAddresses.ts'\n\nexport const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n return uniqueAddresses(accounts.map(account => account.address), throwOnFalse)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
@@ -0,0 +1,3 @@
1
+ import type { AccountInstance } from '@xyo-network/account-model';
2
+ export declare const uniqueAccounts: (accounts: AccountInstance[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAccounts.d.ts","sourceRoot":"","sources":["../../src/uniqueAccounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAIjE,eAAO,MAAM,cAAc,GAAI,UAAU,eAAe,EAAE,EAAE,sBAAoB,YAE/E,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Address } from '@xylabs/hex';
2
+ export declare const uniqueAddresses: (addresses: Address[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAddresses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAddresses.d.ts","sourceRoot":"","sources":["../../src/uniqueAddresses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,eAAe,GAAI,WAAW,OAAO,EAAE,EAAE,sBAAoB,YAYzE,CAAA"}
@@ -4,8 +4,7 @@ import type { BoundWitness, Signed, UnsignedBoundWitness } from '@xyo-network/bo
4
4
  import type { PayloadBuilderOptions } from '@xyo-network/payload-builder';
5
5
  import { PayloadBuilder } from '@xyo-network/payload-builder';
6
6
  import type { ModuleError, Payload, Schema, WithoutClientMeta, WithoutMeta, WithoutSchema, WithoutStorageMeta } from '@xyo-network/payload-model';
7
- export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
8
- export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
7
+ import { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts';
9
8
  export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness, TPayload extends Payload = Payload> extends PayloadBuilder<TBoundWitness, Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>> {
10
9
  private static readonly _buildMutex;
11
10
  private _accounts;
@@ -45,4 +44,4 @@ export declare class BoundWitnessBuilder<TBoundWitness extends UnsignedBoundWitn
45
44
  private generatedFields;
46
45
  private missingSchemaMessage;
47
46
  }
48
- //# sourceMappingURL=Builder.d.ts.map
47
+ //# sourceMappingURL=BoundWitnessBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../src/BoundWitnessBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,OAAO,EAAE,IAAI,EAAE,GAAG,EACnB,MAAM,aAAa,CAAA;AAIpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,oBAAoB,EACrB,MAAM,iCAAiC,CAAA;AAKxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAc,cAAc,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,KAAK,EACV,WAAW,EAAE,OAAO,EAAE,MAAM,EAC5B,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,kBAAkB,EACnB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAA;AAG9E,qBAAa,mBAAmB,CAC9B,aAAa,SAAS,oBAAoB,GAAG,oBAAoB,EACjE,QAAQ,SAAS,OAAO,GAAG,OAAO,CAClC,SAAQ,cAAc,CACpB,aAAa,EACb,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAC5D;IACD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IAEjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAU;IAClC,OAAO,CAAC,SAAS,CAAiB;gBAEtB,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC;IAI3D,SAAS,KAAK,SAAS,IAAI,OAAO,EAAE,CAGnC;IAED,SAAS,KAAK,cAAc,IAAI,MAAM,EAAE,CAOvC;IAED,SAAS,KAAK,iBAAiB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAE5D;IAED,SAAS,KAAK,cAAc,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAE9C;IAED,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO;IAQxE,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO;qBAItD,aAAa,CAAC,CAAC,SAAS,YAAY,EACzD,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,CAAC,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAUhD,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO;qBAIxD,UAAU,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMjG,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAMvB,KAAK,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgB7E,QAAQ;IAMC,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAUxE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAQ3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAW7B,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,EAC7F,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,GAAG,IAAI;IAgBjF,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAOvC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAQ1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IAUvC,MAAM,CAAC,OAAO,EAAE,eAAe;IAM/B,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE;IAMnC,WAAW,CAAC,WAAW,EAAE,IAAI;IAQ7B,qCAAqC;IACrC,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,sCAAsC;IACtC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAMxB,eAAe;IAI7B,OAAO,CAAC,oBAAoB;CAG7B"}
@@ -0,0 +1,3 @@
1
+ export declare const GeneratedBoundWitnessFields: readonly ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
2
+ export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number];
3
+ //# sourceMappingURL=GeneratedBoundWitnessFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneratedBoundWitnessFields.d.ts","sourceRoot":"","sources":["../../src/GeneratedBoundWitnessFields.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,gFAAiF,CAAA;AACzH,MAAM,MAAM,2BAA2B,GAAG,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import type { QueryBoundWitness } from '@xyo-network/boundwitness-model';
2
2
  import type { Query, WithoutMeta } from '@xyo-network/payload-model';
3
- import { BoundWitnessBuilder } from '../Builder.ts';
3
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts';
4
4
  export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
5
5
  private _query;
6
6
  dataHashableFields(): Promise<WithoutMeta<TBoundWitness>>;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAEnD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
1
+ {"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAEpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAoB;IAEnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAQxE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKjC"}
@@ -1,3 +1,3 @@
1
- export * from './Builder.ts';
1
+ export * from './BoundWitnessBuilder.ts';
2
2
  export * from './Query/index.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA"}
@@ -1,4 +1,4 @@
1
- // src/Builder.ts
1
+ // src/BoundWitnessBuilder.ts
2
2
  import { toArrayBuffer } from "@xylabs/arraybuffer";
3
3
  import { assertEx } from "@xylabs/assert";
4
4
  import {
@@ -14,20 +14,31 @@ import {
14
14
  } from "@xyo-network/hash";
15
15
  import { omitSchema, PayloadBuilder } from "@xyo-network/payload-builder";
16
16
  import { Mutex } from "async-mutex";
17
+
18
+ // src/GeneratedBoundWitnessFields.ts
17
19
  var GeneratedBoundWitnessFields = ["addresses", "payload_hashes", "payload_schemas", "previous_hashes"];
18
- var uniqueAccounts = (accounts, throwOnFalse = false) => {
19
- const addresses = /* @__PURE__ */ new Set();
20
- for (const account of accounts) {
21
- if (addresses.has(account.address)) {
20
+
21
+ // src/uniqueAddresses.ts
22
+ var uniqueAddresses = (addresses, throwOnFalse = false) => {
23
+ const addressesSet = /* @__PURE__ */ new Set();
24
+ for (const address of addresses) {
25
+ if (addressesSet.has(address)) {
22
26
  if (throwOnFalse) {
23
27
  throw new Error("Duplicate address");
24
28
  }
25
29
  return false;
26
30
  }
27
- addresses.add(account.address);
31
+ addressesSet.add(address);
28
32
  }
29
33
  return true;
30
34
  };
35
+
36
+ // src/uniqueAccounts.ts
37
+ var uniqueAccounts = (accounts, throwOnFalse = false) => {
38
+ return uniqueAddresses(accounts.map((account) => account.address), throwOnFalse);
39
+ };
40
+
41
+ // src/BoundWitnessBuilder.ts
31
42
  var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
32
43
  static _buildMutex = new Mutex();
33
44
  _accounts = [];
@@ -86,8 +97,8 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilder {
86
97
  }
87
98
  static validateGeneratedFields(fields) {
88
99
  assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => "Payload hash/schema mismatch");
89
- assertEx(!fields.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
90
- assertEx(!fields.payload_schemas.some((schema) => !schema), () => "nulls found in schemas");
100
+ assertEx(!fields.payload_hashes.includes(null), () => "nulls found in hashes");
101
+ assertEx(!fields.payload_schemas.includes(null), () => "nulls found in schemas");
91
102
  }
92
103
  async build() {
93
104
  return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
@@ -232,7 +243,6 @@ var QueryBoundWitnessBuilder = class extends BoundWitnessBuilder {
232
243
  };
233
244
  export {
234
245
  BoundWitnessBuilder,
235
- GeneratedBoundWitnessFields,
236
246
  QueryBoundWitnessBuilder
237
247
  };
238
248
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n\nconst uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n const addresses = new Set<Address>()\n for (const account of accounts) {\n if (addresses.has(account.address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addresses.add(account.address)\n }\n return true\n}\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!fields.payload_hashes.some(hash => !hash), () => 'nulls found in hashes')\n assertEx(!fields.payload_schemas.some(schema => !schema), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../Builder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
1
+ {"version":3,"sources":["../../src/BoundWitnessBuilder.ts","../../src/GeneratedBoundWitnessFields.ts","../../src/uniqueAddresses.ts","../../src/uniqueAccounts.ts","../../src/Query/QueryBoundWitnessBuilder.ts"],"sourcesContent":["import { toArrayBuffer } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport type {\n Address, Hash, Hex,\n} from '@xylabs/hex'\nimport {\n asAddress, asHash, hexFromArrayBuffer,\n} from '@xylabs/hex'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport type {\n BoundWitness,\n Signed,\n UnsignedBoundWitness,\n} from '@xyo-network/boundwitness-model'\nimport { BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport {\n ObjectHasher, removeEmptyFields, sortFields,\n} from '@xyo-network/hash'\nimport type { PayloadBuilderOptions } from '@xyo-network/payload-builder'\nimport { omitSchema, PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n ModuleError, Payload, Schema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutSchema,\n WithoutStorageMeta,\n} from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nimport { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts'\nimport { uniqueAccounts } from './uniqueAccounts.ts'\n\nexport class BoundWitnessBuilder<\n TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,\n TPayload extends Payload = Payload>\n extends PayloadBuilder<\n TBoundWitness,\n Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]>\n > {\n private static readonly _buildMutex = new Mutex()\n\n private _accounts: AccountInstance[] = []\n private _errorHashes?: Hash[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: Hash[]\n private _payloadSchemas?: Schema[]\n private _payloads: TPayload[] = []\n\n constructor(options?: Omit<PayloadBuilderOptions, 'schema'>) {\n super({ ...options, schema: BoundWitnessSchema })\n }\n\n protected get addresses(): Address[] {\n uniqueAccounts(this._accounts, true)\n return this._accounts.map(account => account.address.toLowerCase()) as Address[]\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas\n ?? this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBytes(): (ArrayBufferLike | null)[] {\n return this._accounts.map(account => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map(account => account.previousHash ?? null)\n }\n\n static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return asHash(boundWitness.previous_hashes[this.addressIndex(boundWitness, address)])?.toLowerCase()\n }\n\n protected static async linkingFields<T extends BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n ): Promise<Pick<T, GeneratedBoundWitnessFields>> {\n const addresses = accounts.map(account => asAddress(hexFromArrayBuffer(account.addressBytes, { prefix: false }), true))\n const previous_hashes = accounts.map(account => account.previousHash ?? null)\n const payload_hashes = payloads ? await BoundWitnessBuilder.hashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema) ?? []\n return {\n addresses, payload_hashes, payload_schemas, previous_hashes,\n }\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], dataHash: Hash): Promise<string[]> {\n const hashBytes = toArrayBuffer(dataHash)\n const previousHashesBytes = accounts?.map(account => account.previousHashBytes)\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer((await account.sign(hashBytes, previousHashesBytes[index]))[0])))\n }\n\n private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {\n assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')\n assertEx(!(fields.payload_hashes as (Hash | null)[]).includes(null), () => 'nulls found in hashes')\n assertEx(!(fields.payload_schemas as (Schema | null)[]).includes(null), () => 'nulls found in schemas')\n }\n\n override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = await this.dataHashableFields()\n const $signatures = await this.sign()\n\n const ret = {\n ...this._meta, ...dataHashableFields, ...this._fields, $signatures,\n } as Signed<TBoundWitness>\n return [\n ret,\n this._payloads,\n this._errors,\n ]\n })\n }\n\n async dataHash() {\n const dataHashableFields = await this.dataHashableFields()\n const hash = await ObjectHasher.hash(dataHashableFields)\n return hash\n }\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const generatedFields: Pick<TBoundWitness, GeneratedBoundWitnessFields> = await this.generatedFields()\n BoundWitnessBuilder.validateGeneratedFields(generatedFields)\n const fields: WithoutSchema<TBoundWitness> = {\n ...PayloadBuilder.omitMeta(this._fields ?? {}),\n ...generatedFields,\n } as WithoutSchema<TBoundWitness>\n return await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n }\n\n error(payload?: ModuleError) {\n assertEx(this._errorHashes === undefined, () => 'Can not set errors when hashes already set')\n if (payload) {\n this._errors.push(assertEx(sortFields(payload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n for (const error of errors) {\n if (error !== null) {\n this.error(error)\n }\n }\n }\n return this\n }\n\n override fields(fields: WithoutSchema<Omit<WithoutStorageMeta<WithoutClientMeta<TBoundWitness>>,\n 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'>>): this {\n // clean it up just incase\n const clone = structuredClone(fields) as unknown as Partial<TBoundWitness>\n for (const field of GeneratedBoundWitnessFields) {\n delete clone[field]\n }\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = BoundWitnessBuilder.omitStorageMeta(\n BoundWitnessBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<TBoundWitness>>>\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\n assertEx(this.payloads.length === 0, () => 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n assertEx(this._payloadHashes === undefined, () => 'Can not set payloads when hashes already set')\n if (payload) {\n this._payloads.push(assertEx(sortFields<TPayload>(payload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n for (const payload of payloads) {\n if (payload !== null) {\n this.payload(payload)\n }\n }\n return this\n }\n\n signer(account: AccountInstance) {\n uniqueAccounts([...this._accounts, account], true)\n this._accounts?.push(account)\n return this\n }\n\n signers(accounts: AccountInstance[]) {\n uniqueAccounts([...this._accounts, ...accounts], true)\n this._accounts?.push(...accounts)\n return this\n }\n\n sourceQuery(sourceQuery: Hash) {\n this._meta = {\n ...this._meta,\n $sourceQuery: sourceQuery,\n } as typeof this._meta\n return this\n }\n\n /** @deprecated use signer instead */\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n /** @deprecated use signers instead */\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async sign(): Promise<Hex[]> {\n uniqueAccounts(this._accounts, true)\n const hashBytes = toArrayBuffer(await this.dataHash())\n return await Promise.all(this._accounts.map(async account => hexFromArrayBuffer((await account.sign(hashBytes))[0])))\n }\n\n private async generatedFields(): Promise<Pick<TBoundWitness, GeneratedBoundWitnessFields>> {\n return await BoundWitnessBuilder.linkingFields(this._accounts, this._payloads)\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const\nexport type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]\n","import type { Address } from '@xylabs/hex'\n\nexport const uniqueAddresses = (addresses: Address[], throwOnFalse = false) => {\n const addressesSet = new Set<Address>()\n for (const address of addresses) {\n if (addressesSet.has(address)) {\n if (throwOnFalse) {\n throw new Error('Duplicate address')\n }\n return false\n }\n addressesSet.add(address)\n }\n return true\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\n\nimport { uniqueAddresses } from './uniqueAddresses.ts'\n\nexport const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {\n return uniqueAddresses(accounts.map(account => account.address), throwOnFalse)\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { PayloadBuilder } from '@xyo-network/payload'\nimport type { Query, WithoutMeta } from '@xyo-network/payload-model'\n\nimport { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: TQuery | undefined\n\n override async dataHashableFields(): Promise<WithoutMeta<TBoundWitness>> {\n const fields = {\n ...(await super.dataHashableFields()),\n query: await PayloadBuilder.dataHash(assertEx(this._query, () => 'No Query Specified')),\n } as TBoundWitness\n return { ...fields } as WithoutMeta<TBoundWitness>\n }\n\n query<T extends TQuery>(query: T) {\n this.payload(query)\n this._query = query\n return this\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadBuilder","PayloadBuilder","assertEx"]}
@@ -0,0 +1,3 @@
1
+ import type { AccountInstance } from '@xyo-network/account-model';
2
+ export declare const uniqueAccounts: (accounts: AccountInstance[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAccounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAccounts.d.ts","sourceRoot":"","sources":["../../src/uniqueAccounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAIjE,eAAO,MAAM,cAAc,GAAI,UAAU,eAAe,EAAE,EAAE,sBAAoB,YAE/E,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Address } from '@xylabs/hex';
2
+ export declare const uniqueAddresses: (addresses: Address[], throwOnFalse?: boolean) => boolean;
3
+ //# sourceMappingURL=uniqueAddresses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniqueAddresses.d.ts","sourceRoot":"","sources":["../../src/uniqueAddresses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,eAAe,GAAI,WAAW,OAAO,EAAE,EAAE,sBAAoB,YAYzE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/boundwitness-builder",
3
- "version": "4.3.0",
3
+ "version": "5.0.0",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -28,25 +28,29 @@
28
28
  },
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/neutral/index.d.ts",
31
+ "files": [
32
+ "dist",
33
+ "src"
34
+ ],
31
35
  "dependencies": {
32
- "@xylabs/arraybuffer": "^4.15.0",
33
- "@xylabs/assert": "^4.15.0",
34
- "@xylabs/hex": "^4.15.0",
35
- "@xyo-network/account-model": "^4.3.0",
36
- "@xyo-network/boundwitness-model": "^4.3.0",
37
- "@xyo-network/hash": "^4.3.0",
38
- "@xyo-network/payload": "^4.3.0",
39
- "@xyo-network/payload-builder": "^4.3.0",
40
- "@xyo-network/payload-model": "^4.3.0",
36
+ "@xylabs/arraybuffer": "^5.0.0",
37
+ "@xylabs/assert": "^5.0.0",
38
+ "@xylabs/hex": "^5.0.0",
39
+ "@xyo-network/account-model": "^5.0.0",
40
+ "@xyo-network/boundwitness-model": "^5.0.0",
41
+ "@xyo-network/hash": "^5.0.0",
42
+ "@xyo-network/payload": "^5.0.0",
43
+ "@xyo-network/payload-builder": "^5.0.0",
44
+ "@xyo-network/payload-model": "^5.0.0",
41
45
  "async-mutex": "^0.5.0"
42
46
  },
43
47
  "devDependencies": {
44
- "@xylabs/ts-scripts-yarn3": "^7.0.1",
45
- "@xylabs/tsconfig": "^7.0.1",
46
- "@xylabs/vitest-extended": "^4.15.0",
47
- "@xyo-network/account": "^4.3.0",
48
- "@xyo-network/elliptic": "^4.3.0",
49
- "@xyo-network/wallet": "^4.3.0",
48
+ "@xylabs/ts-scripts-yarn3": "^7.0.2",
49
+ "@xylabs/tsconfig": "^7.0.2",
50
+ "@xylabs/vitest-extended": "^5.0.0",
51
+ "@xyo-network/account": "^5.0.0",
52
+ "@xyo-network/elliptic": "^5.0.0",
53
+ "@xyo-network/wallet": "^5.0.0",
50
54
  "typescript": "^5.8.3",
51
55
  "vitest": "^3.2.4"
52
56
  },
@@ -27,22 +27,8 @@ import type {
27
27
  } from '@xyo-network/payload-model'
28
28
  import { Mutex } from 'async-mutex'
29
29
 
30
- export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const
31
- export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]
32
-
33
- const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {
34
- const addresses = new Set<Address>()
35
- for (const account of accounts) {
36
- if (addresses.has(account.address)) {
37
- if (throwOnFalse) {
38
- throw new Error('Duplicate address')
39
- }
40
- return false
41
- }
42
- addresses.add(account.address)
43
- }
44
- return true
45
- }
30
+ import { GeneratedBoundWitnessFields } from './GeneratedBoundWitnessFields.ts'
31
+ import { uniqueAccounts } from './uniqueAccounts.ts'
46
32
 
47
33
  export class BoundWitnessBuilder<
48
34
  TBoundWitness extends UnsignedBoundWitness = UnsignedBoundWitness,
@@ -123,8 +109,8 @@ export class BoundWitnessBuilder<
123
109
 
124
110
  private static validateGeneratedFields(fields: Pick<BoundWitness, GeneratedBoundWitnessFields>) {
125
111
  assertEx(fields.payload_hashes?.length === fields.payload_schemas?.length, () => 'Payload hash/schema mismatch')
126
- assertEx(!fields.payload_hashes.some(hash => !hash), () => 'nulls found in hashes')
127
- assertEx(!fields.payload_schemas.some(schema => !schema), () => 'nulls found in schemas')
112
+ assertEx(!(fields.payload_hashes as (Hash | null)[]).includes(null), () => 'nulls found in hashes')
113
+ assertEx(!(fields.payload_schemas as (Schema | null)[]).includes(null), () => 'nulls found in schemas')
128
114
  }
129
115
 
130
116
  override async build(): Promise<[Signed<TBoundWitness>, TPayload[], ModuleError[]]> {
@@ -0,0 +1,2 @@
1
+ export const GeneratedBoundWitnessFields = ['addresses', 'payload_hashes', 'payload_schemas', 'previous_hashes'] as const
2
+ export type GeneratedBoundWitnessFields = typeof GeneratedBoundWitnessFields[number]
@@ -3,7 +3,7 @@ import type { QueryBoundWitness } from '@xyo-network/boundwitness-model'
3
3
  import { PayloadBuilder } from '@xyo-network/payload'
4
4
  import type { Query, WithoutMeta } from '@xyo-network/payload-model'
5
5
 
6
- import { BoundWitnessBuilder } from '../Builder.ts'
6
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'
7
7
 
8
8
  export class QueryBoundWitnessBuilder<
9
9
  TBoundWitness extends QueryBoundWitness = QueryBoundWitness,
package/src/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './Builder.ts'
1
+ export * from './BoundWitnessBuilder.ts'
2
2
  export * from './Query/index.ts'
@@ -0,0 +1,31 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { Account } from '@xyo-network/account'
4
+ import { PayloadBuilder } from '@xyo-network/payload'
5
+ import {
6
+ describe, expect, it,
7
+ } from 'vitest'
8
+
9
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'
10
+
11
+ const schema = 'network.xyo.test'
12
+
13
+ const payloadsPromise = (async () =>
14
+ await Promise.all(
15
+ Array(5000)
16
+ .fill(Math.random())
17
+ .map(value => new PayloadBuilder({ schema }).fields({ value }).build()),
18
+ ))()
19
+
20
+ describe('BoundWitnessBuilder-Perf', () => {
21
+ it('build', async () => {
22
+ const startTime = Date.now()
23
+ const bw = new BoundWitnessBuilder()
24
+ .payloads(await payloadsPromise)
25
+ .signer(await Account.random())
26
+ .build()
27
+ const duration = Date.now() - startTime
28
+ expect(bw).toBeDefined()
29
+ expect(duration).toBeLessThan(10_000)
30
+ })
31
+ })
@@ -0,0 +1,175 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
4
+ import { HDWallet } from '@xyo-network/wallet'
5
+ import {
6
+ afterAll,
7
+ beforeAll,
8
+ describe, expect, it,
9
+ vi,
10
+ } from 'vitest'
11
+
12
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'
13
+
14
+ const payloadSequences = [
15
+ {
16
+ payloads: [{ salt: '0', schema: 'network.xyo.id' }],
17
+ payloadHashes: [
18
+ 'ada56ff753c0c9b2ce5e1f823eda9ac53501db2843d8883d6cf6869c18ef7f65',
19
+ ],
20
+ },
21
+ {
22
+ payloads: [{ salt: '1', schema: 'network.xyo.id' }],
23
+ payloadHashes: [
24
+ '3a3b8deca568ff820b0b7c8714fbdf82b40fb54f4b15aca8745e06b81291558e',
25
+ ],
26
+ },
27
+ {
28
+ payloads: [{ salt: '2', schema: 'network.xyo.id' }, { salt: '3', schema: 'network.xyo.id' }],
29
+ payloadHashes: [
30
+ '1a40207fab71fc184e88557d5bee6196cbbb49f11f73cda85000555a628a8f0a',
31
+ 'c4bce9b4d3239fcc9a248251d1bef1ba7677e3c0c2c43ce909a6668885b519e6',
32
+ ],
33
+ },
34
+ {
35
+ payloads: [{ salt: '4', schema: 'network.xyo.id' }, { salt: '5', schema: 'network.xyo.id' }],
36
+ payloadHashes: [
37
+ '59c0374dd801ae64ddddba27320ca028d7bd4b3d460f6674c7da1b4aa9c956d6',
38
+ '5d9b8e84bc824280fcbb6290904c2edbb401d626ad9789717c0a23d1cab937b0',
39
+ ],
40
+ },
41
+ ]
42
+
43
+ const wallet1Mnemonic
44
+ = 'report door cry include salad horn recipe luxury access pledge husband maple busy double olive'
45
+ const wallet1Path = "m/44'/60'/0'/0/0"
46
+ const wallet1Address = '25524Ca99764D76CA27604Bb9727f6e2f27C4533'
47
+
48
+ const wallet2Mnemonic
49
+ = 'turn you orphan sauce act patient village entire lava transfer height sense enroll quit idle'
50
+ const wallet2Path = "m/44'/60'/0'/0/0"
51
+ const wallet2Address = 'FdCeD2c3549289049BeBf743fB721Df211633fBF'
52
+
53
+ const boundWitnessSequenceTestCase1 = {
54
+ mnemonics: [wallet1Mnemonic],
55
+ paths: [wallet1Path],
56
+ addresses: [wallet1Address],
57
+ payloads: payloadSequences[0].payloads,
58
+ payloadHashes: payloadSequences[0].payloadHashes,
59
+ previousHashes: [null],
60
+ dataHash: '750113b9826ba94b622667b06cd8467f1330837581c28907c16160fec20d0a4b',
61
+ }
62
+
63
+ const boundWitnessSequenceTestCase2 = {
64
+ mnemonics: [wallet2Mnemonic],
65
+ paths: [wallet2Path],
66
+ addresses: [wallet2Address],
67
+ payloads: payloadSequences[1].payloads,
68
+ payloadHashes: payloadSequences[1].payloadHashes,
69
+ previousHashes: [null],
70
+ dataHash: 'bacd010d79126a154339e59c11c5b46be032c3bef65626f83bcafe968dc6dd1b',
71
+ }
72
+
73
+ const boundWitnessSequenceTestCase3 = {
74
+ mnemonics: [wallet1Mnemonic, wallet2Mnemonic],
75
+ paths: [wallet1Path, wallet2Path],
76
+ addresses: [wallet1Address, wallet2Address],
77
+ payloads: payloadSequences[2].payloads,
78
+ payloadHashes: payloadSequences[2].payloadHashes,
79
+ previousHashes: [
80
+ '750113b9826ba94b622667b06cd8467f1330837581c28907c16160fec20d0a4b',
81
+ 'bacd010d79126a154339e59c11c5b46be032c3bef65626f83bcafe968dc6dd1b',
82
+ ],
83
+ dataHash: '73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8',
84
+ }
85
+
86
+ const boundWitnessSequenceTestCase4 = {
87
+ mnemonics: [wallet1Mnemonic, wallet2Mnemonic],
88
+ paths: [wallet1Path, wallet2Path],
89
+ addresses: [wallet1Address, wallet2Address],
90
+ payloads: payloadSequences[3].payloads,
91
+ payloadHashes: payloadSequences[3].payloadHashes,
92
+ previousHashes: [
93
+ '73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8',
94
+ '73245ef73517913f4b57c12d56d81199968ecd8fbefea9ddc474f43dd6cfa8c8',
95
+ ],
96
+ dataHash: '210d86ea43d82b85a49b77959a8ee4e6016ff7036254cfa39953befc66073010',
97
+ }
98
+
99
+ const boundWitnessSequenceTestCases = [
100
+ boundWitnessSequenceTestCase1,
101
+ boundWitnessSequenceTestCase2,
102
+ boundWitnessSequenceTestCase3,
103
+ boundWitnessSequenceTestCase4,
104
+ ]
105
+
106
+ describe.sequential('BoundWitnessBuilder', () => {
107
+ beforeAll(() => {
108
+ // NOTE: This is here and brittle because the BoundWitnessBuilder
109
+ // uses Date.now() to generate timestamps and our test vectors were
110
+ // generated without them. We need to find a better way to handle
111
+ // this but for now this gives us parity with the vectors in other
112
+ // language's test cases.
113
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
114
+ vi.spyOn(Date, 'now').mockImplementation(() => undefined as any)
115
+ })
116
+
117
+ afterAll(() => {
118
+ vi.restoreAllMocks()
119
+ })
120
+ describe('Sequence Tests', () => {
121
+ it.each(boundWitnessSequenceTestCases)('Consistently reproduces sequence', async (testCase) => {
122
+ // Create accounts
123
+ const signers = await Promise.all(testCase.mnemonics.map(async (mnemonic, i) => {
124
+ const path = testCase.paths[i]
125
+ return await HDWallet.fromPhrase(mnemonic, path)
126
+ }))
127
+
128
+ expect(signers.length).to.equal(testCase.addresses.length)
129
+ const actualAddresses = signers.map(signer => signer.address.toLowerCase())
130
+ const expectedAddresses = testCase.addresses.map(address => address.toLowerCase())
131
+ expect(actualAddresses).toEqual(expectedAddresses)
132
+
133
+ // Ensure correct initial account state
134
+ for (let i = 0; i < testCase.previousHashes.length; i++) {
135
+ const previousHash = testCase.previousHashes[i]
136
+ expect(previousHash).toEqual(testCase.previousHashes[i])
137
+ }
138
+
139
+ // Build the BW
140
+ const [bw] = await new BoundWitnessBuilder()
141
+ .signers(signers)
142
+ .payloads(testCase.payloads)
143
+ .build()
144
+
145
+ // Ensure the BW is corrects
146
+ expect(await PayloadBuilder.dataHash(bw)).toEqual(testCase.dataHash)
147
+
148
+ for (let i = 0; i < testCase.payloadHashes.length; i++) {
149
+ const expectedPayloadHash = testCase.payloadHashes[i]
150
+ const actualPayloadHash = bw.payload_hashes[i]
151
+ expect(expectedPayloadHash).to.equal(
152
+ actualPayloadHash,
153
+ 'Incorrect payload hash in BW',
154
+ )
155
+ }
156
+
157
+ for (let i = 0; i < testCase.payloads.length; i++) {
158
+ const payload = testCase.payloads[i]
159
+ const actualSchema = bw.payload_schemas[i]
160
+ expect(payload.schema).to.equal(
161
+ actualSchema,
162
+ 'Incorrect payload schema in BW',
163
+ )
164
+ }
165
+
166
+ // Ensure correct ending account state
167
+ for (const signer of signers) {
168
+ expect(signer.previousHash).to.equal(
169
+ await PayloadBuilder.dataHash(bw),
170
+ 'Incorrect previous hash for account',
171
+ )
172
+ }
173
+ })
174
+ })
175
+ })
@@ -0,0 +1,85 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { toArrayBuffer } from '@xylabs/arraybuffer'
4
+ import type { Address } from '@xylabs/hex'
5
+ import {
6
+ Account,
7
+ AddressValue,
8
+ } from '@xyo-network/account'
9
+ import { Elliptic } from '@xyo-network/elliptic'
10
+ import { PayloadBuilder } from '@xyo-network/payload'
11
+ import { HDWallet } from '@xyo-network/wallet'
12
+ import {
13
+ describe, expect, it,
14
+ } from 'vitest'
15
+
16
+ import { BoundWitnessBuilder } from '../BoundWitnessBuilder.ts'
17
+
18
+ const schema = 'network.xyo.temp'
19
+ const payload1 = {
20
+ number_field: 1,
21
+ object_field: {
22
+ number_value: 2,
23
+ string_value: 'yo',
24
+ },
25
+ schema,
26
+ string_field: 'there',
27
+ timestamp: 1_618_603_439_107,
28
+ }
29
+
30
+ const payload2 = {
31
+ number_field: 1,
32
+ object_field: {
33
+ number_value: 2,
34
+ string_value: 'yo',
35
+ },
36
+ schema,
37
+ string_field: 'there',
38
+ timestamp: 1_618_603_439_107,
39
+ }
40
+ const payloads = [payload1, payload2]
41
+ const payloadHash = '3c817871cbf24708703e907dbc344b1b2aefcc3603d14d59c3a35a5c446410d1'
42
+
43
+ describe('BoundWitnessBuilder', () => {
44
+ describe('hash', () => {
45
+ it.each(payloads)('consistently hashes equivalent payload independent of the order of the keys', async (payload) => {
46
+ const hash = await PayloadBuilder.dataHash(payload)
47
+ expect(hash).toEqual(payloadHash)
48
+ })
49
+ })
50
+ describe('build', () => {
51
+ describe('_hash', () => {
52
+ it.each(payloads)('consistently hashes equivalent payloads independent of the order of the keys', async (payload) => {
53
+ const address = await Account.random() // await HDWallet.fromPhrase('swarm luggage creek win urban boil tray crumble voice scrap yellow live')
54
+ let builder = new BoundWitnessBuilder()
55
+ expect(builder).toBeDefined()
56
+ builder = builder.signer(address)
57
+ expect(builder).toBeDefined()
58
+ builder = builder.payload(payload)
59
+ expect(builder).toBeDefined()
60
+ const [actual] = await builder.build()
61
+ expect(actual.addresses).toBeArrayOfSize(1)
62
+ expect(actual).toBeDefined()
63
+ if (actual.$signatures) {
64
+ const addr = new AddressValue(toArrayBuffer(actual.addresses[0] as Address))
65
+ expect(addr.hex).toBe(actual.addresses[0])
66
+ const hashToVerify = await PayloadBuilder.dataHash(actual)
67
+ console.log('verifying hash:', hashToVerify)
68
+ console.log('verifying address:', actual.addresses[0])
69
+ const verify = await Elliptic.verify(toArrayBuffer(
70
+ hashToVerify,
71
+ ), toArrayBuffer(actual.$signatures[0]), addr.bytes)
72
+ expect(verify).toBe(true)
73
+ }
74
+ })
75
+ })
76
+ describe('with payloads', () => {
77
+ it('omits the _payloads field', async () => {
78
+ const address = await HDWallet.fromPhrase('canyon defense similar chalk good box quote miss decorate load amused gown')
79
+ const builder = new BoundWitnessBuilder().signer(address).payload(payload1)
80
+ const [actual] = await builder.build()
81
+ expect(actual).toBeDefined()
82
+ })
83
+ })
84
+ })
85
+ })
@@ -0,0 +1,7 @@
1
+ import type { AccountInstance } from '@xyo-network/account-model'
2
+
3
+ import { uniqueAddresses } from './uniqueAddresses.ts'
4
+
5
+ export const uniqueAccounts = (accounts: AccountInstance[], throwOnFalse = false) => {
6
+ return uniqueAddresses(accounts.map(account => account.address), throwOnFalse)
7
+ }
@@ -0,0 +1,15 @@
1
+ import type { Address } from '@xylabs/hex'
2
+
3
+ export const uniqueAddresses = (addresses: Address[], throwOnFalse = false) => {
4
+ const addressesSet = new Set<Address>()
5
+ for (const address of addresses) {
6
+ if (addressesSet.has(address)) {
7
+ if (throwOnFalse) {
8
+ throw new Error('Duplicate address')
9
+ }
10
+ return false
11
+ }
12
+ addressesSet.add(address)
13
+ }
14
+ return true
15
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}