@mikeargento/bitgraph-verify 1.6.0 → 1.7.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.
@@ -1,13 +1,20 @@
1
1
  import type { BitGraphProof, VerificationPolicy } from "./types.js";
2
2
  import { type FuseVerifyResult } from "./fuse-verify.js";
3
- export type FuseMemberCategory = "SET_MEMBER_DIRECT" | "SET_MEMBER_FROM_ORIGIN" | "SET_NOT_MEMBER" | "RECONSTRUCTION_MISMATCH" | "INVALID_SET_MANIFEST" | "INVALID_SLOT_COMMITMENT" | "INVALID_ORIGIN_ATTRIBUTION" | "INVALID_UNDERLYING_PROOF" | "UNDETERMINED_PLACEMENT" | "NO_MATCH";
3
+ export type FuseMemberCategory = "SET_MEMBER_DIRECT" | "SET_MEMBER_FROM_ORIGIN" | "SET_NOT_MEMBER" | "SET_MEMBERSHIP_UNPROVEN" | "INVALID_SET_PATH" | "RECONSTRUCTION_MISMATCH" | "INVALID_SET_MANIFEST" | "INVALID_SLOT_COMMITMENT" | "INVALID_ORIGIN_ATTRIBUTION" | "INVALID_UNDERLYING_PROOF" | "UNDETERMINED_PLACEMENT" | "NO_MATCH";
4
4
  export interface FuseSetEvidence {
5
- /** Where the manifest bytes came from: the proof's metadata, or the caller's argument. */
5
+ /** "set/1": the whole member list is the committed artifact. "set/2": a Merkle root over the rows is. */
6
+ kind: "set/1" | "set/2";
7
+ /** Where the committed artifact's bytes came from (the set/1 manifest or the set/2 root document): the proof's metadata, or the caller's argument. */
6
8
  manifestSource: "metadata" | "argument";
7
- /** SHA-256 of the bound manifest bytes; equals artifactDigestB64 once bound. */
9
+ /** SHA-256 of the bound bytes; equals artifactDigestB64 once bound. */
8
10
  manifestDigestB64: string;
11
+ /** set/1: the rows listed. set/2: the count the root document states. */
9
12
  memberCount: number;
10
- /** The matched row. Non-null ONLY on the two member categories. */
13
+ /** set/2 only: where the member's evidence (row, index, path) came from; null when none was in hand. */
14
+ memberSource: "metadata" | "argument" | null;
15
+ /** set/2 only: the tree root, standard base64. */
16
+ treeRootB64: string | null;
17
+ /** The matched row. Non-null ONLY on the two member categories. `index` is the row's index in the list (set/1) or its leaf index in the tree (set/2). */
11
18
  member: {
12
19
  index: number;
13
20
  placement: string;
@@ -18,8 +25,10 @@ export interface FuseSetEvidence {
18
25
  export interface FuseMemberOptions {
19
26
  proof: BitGraphProof;
20
27
  bytes: Uint8Array;
21
- /** Canonical set manifest bytes; when given they replace proof.metadata as the source and are never silently replaced by it. */
28
+ /** Canonical bytes of the committed artifact (a set/1 manifest, or a set/2 root document); when given they replace proof.metadata as the source and are never silently replaced by it. */
22
29
  manifest?: Uint8Array | null;
30
+ /** set/2: the member's evidence (row, index, count, path) as its JSON object; when given it replaces proof.metadata[SET_MEMBER_METADATA_KEY]. */
31
+ member?: unknown;
23
32
  trustAnchors?: VerificationPolicy;
24
33
  /** Refuse to accept a span wider than this many positions (M - N). Never affects validity categories. */
25
34
  maxPositions?: bigint | number;
@@ -1 +1 @@
1
- {"version":3,"file":"fuse-member.d.ts","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkBpE,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhG,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,wBAAwB,GACxB,gBAAgB,GAChB,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,4BAA4B,GAC5B,0BAA0B,GAC1B,wBAAwB,GACxB,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,0FAA0F;IAC1F,cAAc,EAAE,UAAU,GAAG,UAAU,CAAC;IACxC,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtG;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,gIAAgI;IAChI,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,yGAAyG;IACzG,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAClE,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,iFAAiF;IACjF,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC;AAoIF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4MzF"}
1
+ {"version":3,"file":"fuse-member.d.ts","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAuBpE,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhG,MAAM,MAAM,kBAAkB,GAC1B,mBAAmB,GACnB,wBAAwB,GACxB,gBAAgB,GAChB,yBAAyB,GACzB,kBAAkB,GAClB,yBAAyB,GACzB,sBAAsB,GACtB,yBAAyB,GACzB,4BAA4B,GAC5B,0BAA0B,GAC1B,wBAAwB,GACxB,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,yGAAyG;IACzG,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,sJAAsJ;IACtJ,cAAc,EAAE,UAAU,GAAG,UAAU,CAAC;IACxC,uEAAuE;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,wGAAwG;IACxG,YAAY,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;IAC7C,kDAAkD;IAClD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yJAAyJ;IACzJ,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACtG;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,0LAA0L;IAC1L,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,iJAAiJ;IACjJ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,yGAAyG;IACzG,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,GAAG;IAClE,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,iFAAiF;IACjF,GAAG,EAAE,eAAe,GAAG,IAAI,CAAC;CAC7B,CAAC;AA+MF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsOzF"}
@@ -6,6 +6,11 @@
6
6
  * canonical set manifest (placement set/1, see fuse.ts) and every member's
7
7
  * fused bytes carry the set's commitment via the member's own placement.
8
8
  * verifyFuse answers for the manifest; this module answers for a member.
9
+ * A set/2 (fuse.ts) commits the ROOT of a Merkle tree over the same rows
10
+ * instead of the list; its member carries its row, its leaf index and its
11
+ * sibling path, and binding means: root document hashed to the signed
12
+ * artifact and sealed to the slot, then the path reaching that root. From
13
+ * there the two set kinds share every step below.
9
14
  *
10
15
  * Given a proof whose signed attribution declares set/1 and a file:
11
16
  * 1. Verify the proof as an ordinary bitgraph/1 proof. Fail: stop.
@@ -34,7 +39,7 @@
34
39
  */
35
40
  import { sha256 } from "@noble/hashes/sha256";
36
41
  import { verifyProofIntegrity } from "./verifier.js";
37
- import { base64ToBytes, bytesEqual, bytesToBase64, bytesToHex, computeSlotCommitment, getPlacement, PLACEMENTS, parseSetManifest, readFuseAttribution, readSetMetadata, SET_METADATA_KEY, SET_PLACEMENT_ID, } from "./fuse.js";
42
+ import { base64ToBytes, bytesEqual, bytesToBase64, bytesToHex, computeSlotCommitment, getPlacement, PLACEMENTS, parseSetManifest, readFuseAttribution, parseSetMemberProof, parseSetRoot, readSetMetadata, SET_MEMBER_METADATA_KEY, SET_METADATA_KEY, SET_PLACEMENT_ID, SET2_PLACEMENT_ID, setRootFromMember, } from "./fuse.js";
38
43
  import { floorStatement, spanOf } from "./fuse-verify.js";
39
44
  /**
40
45
  * The only constructor of a BoundSet. In order: strict parse, SHA-256 of the
@@ -61,7 +66,57 @@ function bindSetManifest(proof, commitment, bytes, source) {
61
66
  const origin = bytesToHex(row.origin);
62
67
  byOrigin.set(origin, [...(byOrigin.get(origin) ?? []), index]);
63
68
  });
64
- const bound = { source, digestB64: bytesToBase64(digest), commitment, rows: manifest.members, byArtifact, byOrigin };
69
+ const bound = { kind: "set/1", source, digestB64: bytesToBase64(digest), commitment, rows: manifest.members, count: manifest.members.length, treeIndices: null, memberSource: null, rootB64: null, byArtifact, byOrigin };
70
+ return bound;
71
+ }
72
+ /**
73
+ * The only constructor of a set/2 BoundSet. In order: strict parse of the
74
+ * root document, SHA-256 of its bytes equal to the SIGNED artifact digest,
75
+ * commitment equal to the one recomputed from the proof's own slot record;
76
+ * then, when member evidence is in hand, its strict parse, its count equal
77
+ * to the root document's, and its leaf and path recomputing exactly the
78
+ * committed root. A set bound without evidence lists no row: nothing can be
79
+ * admitted against it, and the caller's verdict is that membership was not
80
+ * shown. Rows never enter a BoundSet without their path reaching the root.
81
+ */
82
+ function bindSetRoot(proof, commitment, bytes, source, evidence) {
83
+ const doc = parseSetRoot(bytes);
84
+ if (doc === null) {
85
+ return { category: "INVALID_SET_MANIFEST", reason: "the set root document is not canonical bitgraph-fuse/1 set/2 bytes" };
86
+ }
87
+ const digest = sha256(bytes);
88
+ const artifact = base64ToBytes(proof.artifact.digestB64);
89
+ if (artifact === null || !bytesEqual(digest, artifact)) {
90
+ return { category: "INVALID_SET_MANIFEST", reason: "the set root document does not hash to the committed artifact digest" };
91
+ }
92
+ if (!bytesEqual(doc.commitment, commitment)) {
93
+ return { category: "INVALID_SLOT_COMMITMENT", reason: "the commitment in the committed set root document does not match the proof's slot record" };
94
+ }
95
+ const common = { kind: "set/2", source, digestB64: bytesToBase64(digest), commitment, count: doc.count, rootB64: bytesToBase64(doc.root) };
96
+ if (evidence === null) {
97
+ const empty = { ...common, rows: [], treeIndices: [], memberSource: null, byArtifact: new Map(), byOrigin: new Map() };
98
+ return empty;
99
+ }
100
+ const parsed = parseSetMemberProof(evidence.value);
101
+ if (parsed === null) {
102
+ return { category: "INVALID_SET_PATH", reason: "the member evidence is not a well-formed bitgraph-fuse/1 set/2 member proof" };
103
+ }
104
+ if (parsed.count !== doc.count) {
105
+ return { category: "INVALID_SET_PATH", reason: `the member evidence names a tree of ${parsed.count} leaves; the committed root document states ${doc.count}` };
106
+ }
107
+ const reached = setRootFromMember(parsed.member, parsed.index, parsed.count, parsed.path);
108
+ if (reached === null || !bytesEqual(reached, doc.root)) {
109
+ return { category: "INVALID_SET_PATH", reason: "the member's leaf and path do not recompute the committed root; the row is not shown to be in the set" };
110
+ }
111
+ const row = parsed.member;
112
+ const bound = {
113
+ ...common,
114
+ rows: [row],
115
+ treeIndices: [parsed.index],
116
+ memberSource: evidence.from,
117
+ byArtifact: new Map([[bytesToHex(row.artifact), 0]]),
118
+ byOrigin: new Map([[bytesToHex(row.origin), [0]]]),
119
+ };
65
120
  return bound;
66
121
  }
67
122
  /**
@@ -116,6 +171,15 @@ function strayReason(span, memberCount) {
116
171
  const commit = span !== null ? `committed at position ${span.commitCounter}` : "at its commit";
117
172
  return `these bytes carry the commitment of ${slot}, so they were made after that slot existed, but their digest is not among the ${memberCount} members listed in the set manifest ${commit}; the set proof does not cover them`;
118
173
  }
174
+ /** set/2: the two-part reason when the floor holds but no evidence, or evidence for another member, is in hand. */
175
+ function unprovenReason(span, memberCount, otherMember) {
176
+ const slot = span !== null ? `the slot allocated at position ${span.slotCounter}` : "its slot";
177
+ const commit = span !== null ? `committed at position ${span.commitCounter}` : "at its commit";
178
+ const shown = otherMember
179
+ ? "the member evidence in hand describes a different member, so"
180
+ : "no member evidence (row, index, path) is in hand, so";
181
+ return `these bytes carry the commitment of ${slot}, so they were made after that slot existed, but ${shown} their place among the ${memberCount} members of the set ${commit} is not shown; a set/2 proof covers a member only with its path`;
182
+ }
119
183
  export async function verifyFuseMember(opts) {
120
184
  const { proof, bytes } = opts;
121
185
  const fileDigest = sha256(bytes);
@@ -157,11 +221,12 @@ export async function verifyFuseMember(opts) {
157
221
  maxPositions: maxPositions === null ? null : maxPositions.toString(),
158
222
  };
159
223
  const common = { proof: { valid: true }, marker, span, policy };
160
- if (marker === null || marker.placement !== SET_PLACEMENT_ID) {
161
- return base("INVALID_SET_MANIFEST", common, "the proof is not marked set/1; verifyFuse answers for this proof");
224
+ if (marker === null || (marker.placement !== SET_PLACEMENT_ID && marker.placement !== SET2_PLACEMENT_ID)) {
225
+ return base("INVALID_SET_MANIFEST", common, "the proof is not marked set/1 or set/2; verifyFuse answers for this proof");
162
226
  }
227
+ const setKind = marker.placement === SET2_PLACEMENT_ID ? "set/2" : "set/1";
163
228
  if (marker.originDigest !== undefined) {
164
- return base("INVALID_SET_MANIFEST", common, "the proof is marked set/1 but its signed attribution names an origin digest; a set has no single origin");
229
+ return base("INVALID_SET_MANIFEST", common, `the proof is marked ${setKind} but its signed attribution names an origin digest; a set has no single origin`);
165
230
  }
166
231
  // 3. The commitment, from the proof's own slot record.
167
232
  const slot = proof.slotAllocation;
@@ -177,21 +242,39 @@ export async function verifyFuseMember(opts) {
177
242
  }
178
243
  const slotCommitmentB64 = bytesToBase64(commitment);
179
244
  const withSlot = { ...common, slotCommitmentB64 };
180
- // 4. Bind the manifest. An explicit argument replaces the metadata source
181
- // and is never silently replaced by it.
245
+ // 4. Bind the committed artifact: a set/1 manifest, or a set/2 root
246
+ // document and, when in hand, the member's evidence. An explicit
247
+ // argument replaces the metadata source and is never silently replaced
248
+ // by it.
182
249
  const explicit = opts.manifest === undefined || opts.manifest === null ? null : opts.manifest;
183
250
  const metadata = explicit === null ? readSetMetadata(proof) : null;
184
251
  const source = explicit !== null ? { bytes: explicit, from: "argument" } : metadata !== null ? { bytes: metadata, from: "metadata" } : null;
185
252
  if (source === null) {
186
- return base("INVALID_SET_MANIFEST", withSlot, `no set manifest: none under proof.metadata["${SET_METADATA_KEY}"] and none supplied`);
253
+ return base("INVALID_SET_MANIFEST", withSlot, `no set ${setKind === "set/1" ? "manifest" : "root document"}: none under proof.metadata["${SET_METADATA_KEY}"] and none supplied`);
254
+ }
255
+ let bound;
256
+ if (setKind === "set/1") {
257
+ const b = bindSetManifest(proof, commitment, source.bytes, source.from);
258
+ if ("category" in b)
259
+ return base(b.category, withSlot, b.reason);
260
+ bound = b;
261
+ }
262
+ else {
263
+ const explicitMember = opts.member === undefined || opts.member === null ? null : opts.member;
264
+ const metadataMember = explicitMember === null ? (proof.metadata?.[SET_MEMBER_METADATA_KEY] ?? null) : null;
265
+ const evidenceSource = explicitMember !== null ? { value: explicitMember, from: "argument" } : metadataMember !== null ? { value: metadataMember, from: "metadata" } : null;
266
+ const b = bindSetRoot(proof, commitment, source.bytes, source.from, evidenceSource);
267
+ if ("category" in b)
268
+ return base(b.category, withSlot, b.reason);
269
+ bound = b;
187
270
  }
188
- const bound = bindSetManifest(proof, commitment, source.bytes, source.from);
189
- if ("category" in bound)
190
- return base(bound.category, withSlot, bound.reason);
191
271
  const evidence = (member) => ({
272
+ kind: bound.kind,
192
273
  manifestSource: bound.source,
193
274
  manifestDigestB64: bound.digestB64,
194
- memberCount: bound.rows.length,
275
+ memberCount: bound.count,
276
+ memberSource: bound.memberSource,
277
+ treeRootB64: bound.rootB64,
195
278
  member,
196
279
  });
197
280
  const withSet = { ...withSlot, set: evidence(null) };
@@ -206,18 +289,23 @@ export async function verifyFuseMember(opts) {
206
289
  if (bound.byArtifact.get(bytesToHex(row.artifact)) !== index || bound.rows[index] !== row) {
207
290
  throw new Error("verifyFuseMember: membership re-assertion failed");
208
291
  }
209
- const count = bound.rows.length;
292
+ const count = bound.count;
293
+ // set/1: a row's index is its place in the list. set/2: its leaf index in the tree, carried by the bound evidence.
294
+ const shown = bound.treeIndices !== null ? bound.treeIndices[index] : index;
295
+ const listed = bound.kind === "set/1" ? "listed in the set manifest committed" : "of the set whose Merkle root was committed";
210
296
  const statements = [];
211
297
  if (span !== null) {
212
298
  if (path === "direct") {
213
- statements.push(`These exact fused bytes are member ${index + 1} of ${count} listed in the set manifest committed at position ${span.commitCounter}.`);
299
+ statements.push(`These exact fused bytes are member ${shown + 1} of ${count} ${listed} at position ${span.commitCounter}.`);
214
300
  if (admitted.originCompared) {
215
- statements.push("The fused bytes carry an origin digest that matches the set manifest; the original itself was not supplied and was not checked.");
301
+ statements.push(`The fused bytes carry an origin digest that matches the set ${bound.kind === "set/1" ? "manifest" : "member evidence"}; the original itself was not supplied and was not checked.`);
216
302
  }
217
303
  }
218
304
  else {
219
- statements.push(`The supplied original rebuilds member ${index + 1} of ${count} of the committed set byte for byte, so these exact original bytes existed no later than commit position ${span.commitCounter}.`);
305
+ statements.push(`The supplied original rebuilds member ${shown + 1} of ${count} of the committed set byte for byte, so these exact original bytes existed no later than commit position ${span.commitCounter}.`);
220
306
  }
307
+ if (bound.kind === "set/2")
308
+ statements.push(`The member's leaf and its ${bound.treeIndices !== null ? "path" : "path"} recompute the committed root, so the row is one of the ${count} the set commits to.`);
221
309
  statements.push(floorStatement(span));
222
310
  }
223
311
  return {
@@ -233,12 +321,12 @@ export async function verifyFuseMember(opts) {
233
321
  policy,
234
322
  statements,
235
323
  reason: null,
236
- set: evidence({ index, placement: placement.id, fusedDigestB64: bytesToBase64(row.artifact), originDigestB64: bytesToBase64(row.origin) }),
324
+ set: evidence({ index: shown, placement: placement.id, fusedDigestB64: bytesToBase64(row.artifact), originDigestB64: bytesToBase64(row.origin) }),
237
325
  };
238
326
  };
239
- // 5. The bytes are the committed manifest itself: verifyFuse answers for it.
327
+ // 5. The bytes are the committed artifact itself: verifyFuse answers for it.
240
328
  if (fileDigestB64 === artifactDigestB64) {
241
- return base("NO_MATCH", withSet, "these bytes are the committed set manifest itself, not a member; verifyFuse answers for the manifest");
329
+ return base("NO_MATCH", withSet, `these bytes are the committed set ${bound.kind === "set/1" ? "manifest" : "root document"} itself, not a member; verifyFuse answers for it`);
242
330
  }
243
331
  // 6. Direct path: the bytes hash to a listed member. Authoritative when it
244
332
  // applies: its failure is the verdict, with no fall-through.
@@ -289,15 +377,21 @@ export async function verifyFuseMember(opts) {
289
377
  }
290
378
  return base("RECONSTRUCTION_MISMATCH", { ...withSet, placement: candidates[0] ?? null, originDigestB64: fileDigestB64 }, `rebuilding ${candidates.join(" or ")} from this file and the proof's slot record does not reproduce the listed member digest`);
291
379
  }
292
- // 8. Stray scan: bytes that carry this slot's commitment yet are listed
293
- // nowhere. Made after the slot, not part of the committed set: the
294
- // two-part verdict, with no rendered floor.
380
+ // 8. Stray scan: bytes that carry this slot's commitment yet match no row
381
+ // in hand. set/1 lists every row, so this is the two-part verdict: made
382
+ // after the slot, not part of the committed set. set/2 has in hand at
383
+ // most the one row its evidence proved, so absence is not shown: the
384
+ // floor holds, membership is unproven (no evidence) or the evidence is
385
+ // another member's. No rendered floor in either case.
295
386
  for (const p of PLACEMENTS) {
296
387
  const l = p.locate(bytes);
297
388
  if (l === null)
298
389
  continue;
299
390
  if (bytesEqual(l.commitment, commitment)) {
300
- return base("SET_NOT_MEMBER", { ...withSet, placement: p.id, statements: [] }, strayReason(span, bound.rows.length));
391
+ if (bound.kind === "set/1")
392
+ return base("SET_NOT_MEMBER", { ...withSet, placement: p.id, statements: [] }, strayReason(span, bound.count));
393
+ const other = bound.rows.length > 0;
394
+ return base(other ? "INVALID_SET_PATH" : "SET_MEMBERSHIP_UNPROVEN", { ...withSet, placement: p.id, statements: [] }, unprovenReason(span, bound.count, other));
301
395
  }
302
396
  return base("NO_MATCH", withSet, "these bytes carry a commitment to a different slot; the proof proves nothing about them");
303
397
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fuse-member.js","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fuse-member.js","sourceRoot":"","sources":["../src/fuse-member.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAwC,MAAM,kBAAkB,CAAC;AA2GhG;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAoB,EAAE,UAAsB,EAAE,KAAiB,EAAE,MAA+B;IACvH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,+DAA+D,EAAE,CAAC;IACvH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,iEAAiE,EAAE,CAAC;IACzH,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,EAAE,qFAAqF,EAAE,CAAC;IAChJ,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACtC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAsC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC7P,OAAO,KAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAClB,KAAoB,EACpB,UAAsB,EACtB,KAAiB,EACjB,MAA+B,EAC/B,QAAkE;IAElE,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,oEAAoE,EAAE,CAAC;IAC5H,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,EAAE,sEAAsE,EAAE,CAAC;IAC9H,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,EAAE,0FAA0F,EAAE,CAAC;IACrJ,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACpJ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAsC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAC1J,OAAO,KAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,6EAA6E,EAAE,CAAC;IACjI,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,uCAAuC,MAAM,CAAC,KAAK,+CAA+C,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACjK,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1F,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,uGAAuG,EAAE,CAAC;IAC3J,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAsC;QAC/C,GAAG,MAAM;QACT,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACnD,CAAC;IACF,OAAO,KAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,KAAK,CAAC,KAAe,EAAE,UAAsB,EAAE,GAAc;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtG,yEAAyE;QACzE,mEAAmE;QACnE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,CAAC,SAAS,uDAAuD,EAAE,CAAC;IAC7J,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,QAAQ,EAAE,yBAAyB;YACnC,SAAS,EAAE,SAAS,CAAC,EAAE;YACvB,MAAM,EAAE,gDAAgD,SAAS,CAAC,EAAE,yFAAyF;SAC9J,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO;YACL,QAAQ,EAAE,yBAAyB;YACnC,SAAS,EAAE,SAAS,CAAC,EAAE;YACvB,MAAM,EAAE,kJAAkJ;SAC3J,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3H,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,2FAA2F,EAAE,CAAC;QAClL,CAAC;QACD,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;IACD,MAAM,QAAQ,GAAyC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IACjH,OAAO,QAAoB,CAAC;AAC9B,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,IAAqB,EAAE,WAAmB;IAC7D,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,kCAAkC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAC/F,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAC/F,OAAO,uCAAuC,IAAI,kFAAkF,WAAW,uCAAuC,MAAM,qCAAqC,CAAC;AACpO,CAAC;AAED,mHAAmH;AACnH,SAAS,cAAc,CAAC,IAAqB,EAAE,WAAmB,EAAE,WAAoB;IACtF,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,kCAAkC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAC/F,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAC/F,MAAM,KAAK,GAAG,WAAW;QACvB,CAAC,CAAC,8DAA8D;QAChE,CAAC,CAAC,sDAAsD,CAAC;IAC3D,OAAO,uCAAuC,IAAI,oDAAoD,KAAK,0BAA0B,WAAW,uBAAuB,MAAM,iEAAiE,CAAC;AACjP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAuB;IAC5D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC;IAK3D,MAAM,IAAI,GAAG,CAAC,QAA2B,EAAE,KAAgC,EAAE,MAAqB,EAAoB,EAAE,CAAC,CAAC;QACxH,QAAQ;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QACrC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,aAAa;QACb,iBAAiB;QACjB,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;QAC9C,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;QAClD,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE;QACnE,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,MAAM;QACN,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;KACvB,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CACzF,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,2BAA2B,CAAC;QAC/D,OAAO,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACvF,CAAC;IAED,qEAAqE;IACrE,sEAAsE;IACtE,4EAA4E;IAC5E,qEAAqE;IACrE,0EAA0E;IAC1E,sEAAsE;IACtE,kEAAkE;IAClE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG;QACb,YAAY,EAAE,YAAY,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,YAAY;QAC7F,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE;KACrE,CAAC;IACF,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChE,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,gBAAgB,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,CAAC,EAAE,CAAC;QACzG,OAAO,IAAI,CAAC,sBAAsB,EAAE,MAAM,EAAE,2EAA2E,CAAC,CAAC;IAC3H,CAAC;IACD,MAAM,OAAO,GAAsB,MAAM,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9F,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,sBAAsB,EAAE,MAAM,EAAE,uBAAuB,OAAO,gFAAgF,CAAC,CAAC;IAC9J,CAAC;IAED,uDAAuD;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,yBAAyB,EAAE,MAAM,EAAE,sEAAsE,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,yBAAyB,EAAE,MAAM,EAAE,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5I,CAAC;IACD,MAAM,iBAAiB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAElD,oEAAoE;IACpE,oEAAoE;IACpE,0EAA0E;IAC1E,YAAY;IACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC9F,MAAM,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9J,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,sBAAsB,EAAE,QAAQ,EAAE,UAAU,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,gCAAgC,gBAAgB,sBAAsB,CAAC,CAAC;IACpL,CAAC;IACD,IAAI,KAAe,CAAC;IACpB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACjE,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9F,MAAM,cAAc,GAAG,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,uBAAuB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5G,MAAM,cAAc,GAAG,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9L,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACpF,IAAI,UAAU,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACjE,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,MAAiC,EAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,cAAc,EAAE,KAAK,CAAC,MAAM;QAC5B,iBAAiB,EAAE,KAAK,CAAC,SAAS;QAClC,WAAW,EAAE,KAAK,CAAC,KAAK;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,OAAO;QAC1B,MAAM;KACP,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAErD,wEAAwE;IACxE,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAE,IAAyB,EAAoB,EAAE;QACvF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;QACpD,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1F,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,mHAAmH;QACnH,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,4CAA4C,CAAC;QAC9H,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC,sCAAsC,KAAK,GAAG,CAAC,OAAO,KAAK,IAAI,MAAM,gBAAgB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC5H,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAC5B,UAAU,CAAC,IAAI,CAAC,+DAA+D,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,6DAA6D,CAAC,CAAC;gBACvM,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CACb,yCAAyC,KAAK,GAAG,CAAC,OAAO,KAAK,4GAA4G,IAAI,CAAC,aAAa,GAAG,CAChM,CAAC;YACJ,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,UAAU,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,2DAA2D,KAAK,sBAAsB,CAAC,CAAC;YAC7M,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,wBAAwB;YAC5E,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;YACtB,MAAM;YACN,SAAS,EAAE,SAAS,CAAC,EAAE;YACvB,aAAa;YACb,iBAAiB;YACjB,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1C,iBAAiB;YACjB,IAAI;YACJ,MAAM;YACN,UAAU;YACV,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SAClJ,CAAC;IACJ,CAAC,CAAC;IAEF,6EAA6E;IAC7E,IAAI,aAAa,KAAK,iBAAiB,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,qCAAqC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,kDAAkD,CAAC,CAAC;IACjL,CAAC;IAED,2EAA2E;IAC3E,gEAAgE;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1I,CAAC;QACD,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjC,SAAS;YACX,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,CAAC,CAAC,SAAS;gBAAE,SAAS;YAC3B,IAAI,OAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/E,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACzD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3C,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9H,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CACT,wBAAwB,EACxB,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,EAC9C,cAAc,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,wDAAwD,CAChG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CACT,yBAAyB,EACzB,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,EAChF,cAAc,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,yFAAyF,CAC/H,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,yEAAyE;IACzE,wEAAwE;IACxE,0EAA0E;IAC1E,yDAAyD;IACzD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QACzB,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;YACzC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3I,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,yBAAyB,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjK,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,yFAAyF,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,sIAAsI,CAAC,CAAC;AAC3K,CAAC"}
@@ -0,0 +1,42 @@
1
+ /** SHA-256(0x00 || bytes): the hash of one leaf. */
2
+ export declare function merkleLeafHash(bytes: Uint8Array): Uint8Array;
3
+ /** SHA-256(0x01 || left || right): one inner node. */
4
+ export declare function merkleNodeHash(left: Uint8Array, right: Uint8Array): Uint8Array;
5
+ /**
6
+ * The root over leaf HASHES (each already merkleLeafHash of its leaf), in
7
+ * list order. Throws on an empty list; the root of one leaf hash is that
8
+ * hash itself, as in RFC 6962.
9
+ */
10
+ export declare function merkleRoot(leafHashes: readonly Uint8Array[]): Uint8Array;
11
+ /**
12
+ * The inclusion path of the leaf at `index`: its siblings from the leaf's
13
+ * own level up to the root, in that order (RFC 6962 PATH). Empty for a tree
14
+ * of one leaf.
15
+ */
16
+ export declare function merklePath(leafHashes: readonly Uint8Array[], index: number): Uint8Array[];
17
+ /**
18
+ * Recompute the root from one leaf hash, its index, the tree size and its
19
+ * path (RFC 9162 section 2.1.3.2). Null when the path does not fit the
20
+ * index and size: too short, too long, or an index outside the tree. A
21
+ * result that equals the committed root proves the leaf is at `index` in a
22
+ * tree of `size` leaves with that root; nothing else is proven.
23
+ */
24
+ export declare function merkleRootFromPath(leafHash: Uint8Array, index: number, size: number, path: readonly Uint8Array[]): Uint8Array | null;
25
+ /**
26
+ * The whole tree over a list of leaf hashes, every subtree root computed
27
+ * once, so the paths of all N leaves cost N log N hashes in total instead of
28
+ * N per path. The split rule and the path order are merkleRoot's and
29
+ * merklePath's exactly; a test pins them equal.
30
+ */
31
+ export declare class MerkleTree {
32
+ readonly size: number;
33
+ readonly root: Uint8Array;
34
+ private readonly leafHashes;
35
+ /** Subtree root by "lo:hi". */
36
+ private readonly memo;
37
+ constructor(leafHashes: readonly Uint8Array[]);
38
+ private subtree;
39
+ /** The inclusion path of the leaf at `index`, siblings from the leaf's level up. */
40
+ path(index: number): Uint8Array[];
41
+ }
42
+ //# sourceMappingURL=fuse-merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuse-merkle.d.ts","sourceRoot":"","sources":["../src/fuse-merkle.ts"],"names":[],"mappings":"AA6BA,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAE5D;AAED,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CAE9E;AASD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAUxE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAoBzF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,GAAG,IAAI,CAyBpI;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;gBAE1C,UAAU,EAAE,SAAS,UAAU,EAAE;IAQ7C,OAAO,CAAC,OAAO;IAYf,oFAAoF;IACpF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE;CAkBlC"}
@@ -0,0 +1,188 @@
1
+ // Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
2
+ /**
3
+ * The Merkle tree a set/2 commits to: RFC 6962 (Certificate Transparency)
4
+ * hashing over an ordered list of leaf hashes, with the RFC 9162 inclusion
5
+ * proof. Domain separation is the RFC's: a leaf hash is SHA-256 of 0x00 and
6
+ * the leaf's bytes, an inner node SHA-256 of 0x01, left, right. A list of
7
+ * n leaves splits at k, the largest power of two below n, so every list has
8
+ * exactly one root and every leaf exactly one inclusion path of at most
9
+ * ceil(log2 n) siblings. Nothing here knows what a leaf is; fuse.ts says.
10
+ */
11
+ import { sha256 } from "@noble/hashes/sha256";
12
+ const LEAF_PREFIX = new Uint8Array([0x00]);
13
+ const NODE_PREFIX = new Uint8Array([0x01]);
14
+ function concat(...parts) {
15
+ let n = 0;
16
+ for (const p of parts)
17
+ n += p.length;
18
+ const out = new Uint8Array(n);
19
+ let o = 0;
20
+ for (const p of parts) {
21
+ out.set(p, o);
22
+ o += p.length;
23
+ }
24
+ return out;
25
+ }
26
+ /** SHA-256(0x00 || bytes): the hash of one leaf. */
27
+ export function merkleLeafHash(bytes) {
28
+ return sha256(concat(LEAF_PREFIX, bytes));
29
+ }
30
+ /** SHA-256(0x01 || left || right): one inner node. */
31
+ export function merkleNodeHash(left, right) {
32
+ return sha256(concat(NODE_PREFIX, left, right));
33
+ }
34
+ /** The largest power of two strictly below n (n >= 2). */
35
+ function split(n) {
36
+ let k = 1;
37
+ while (k * 2 < n)
38
+ k *= 2;
39
+ return k;
40
+ }
41
+ /**
42
+ * The root over leaf HASHES (each already merkleLeafHash of its leaf), in
43
+ * list order. Throws on an empty list; the root of one leaf hash is that
44
+ * hash itself, as in RFC 6962.
45
+ */
46
+ export function merkleRoot(leafHashes) {
47
+ if (leafHashes.length === 0)
48
+ throw new TypeError("a Merkle tree needs at least one leaf");
49
+ for (const h of leafHashes)
50
+ if (h.length !== 32)
51
+ throw new TypeError("a leaf hash is 32 bytes");
52
+ const build = (lo, hi) => {
53
+ const n = hi - lo;
54
+ if (n === 1)
55
+ return leafHashes[lo];
56
+ const k = split(n);
57
+ return merkleNodeHash(build(lo, lo + k), build(lo + k, hi));
58
+ };
59
+ return build(0, leafHashes.length);
60
+ }
61
+ /**
62
+ * The inclusion path of the leaf at `index`: its siblings from the leaf's
63
+ * own level up to the root, in that order (RFC 6962 PATH). Empty for a tree
64
+ * of one leaf.
65
+ */
66
+ export function merklePath(leafHashes, index) {
67
+ const n = leafHashes.length;
68
+ if (n === 0)
69
+ throw new TypeError("a Merkle tree needs at least one leaf");
70
+ if (!Number.isInteger(index) || index < 0 || index >= n)
71
+ throw new RangeError("leaf index out of range");
72
+ const path = [];
73
+ const walk = (lo, hi, m) => {
74
+ const size = hi - lo;
75
+ if (size === 1)
76
+ return;
77
+ const k = split(size);
78
+ const build = (a, b) => merkleRoot(leafHashes.slice(a, b));
79
+ if (m < lo + k) {
80
+ walk(lo, lo + k, m);
81
+ path.push(build(lo + k, hi));
82
+ }
83
+ else {
84
+ walk(lo + k, hi, m);
85
+ path.push(build(lo, lo + k));
86
+ }
87
+ };
88
+ walk(0, n, index);
89
+ return path;
90
+ }
91
+ /**
92
+ * Recompute the root from one leaf hash, its index, the tree size and its
93
+ * path (RFC 9162 section 2.1.3.2). Null when the path does not fit the
94
+ * index and size: too short, too long, or an index outside the tree. A
95
+ * result that equals the committed root proves the leaf is at `index` in a
96
+ * tree of `size` leaves with that root; nothing else is proven.
97
+ */
98
+ export function merkleRootFromPath(leafHash, index, size, path) {
99
+ if (!Number.isInteger(index) || !Number.isInteger(size) || size < 1 || index < 0 || index >= size)
100
+ return null;
101
+ if (leafHash.length !== 32)
102
+ return null;
103
+ let fn = index;
104
+ let sn = size - 1;
105
+ let r = leafHash;
106
+ for (const p of path) {
107
+ if (p.length !== 32)
108
+ return null;
109
+ if (sn === 0)
110
+ return null;
111
+ if ((fn & 1) === 1 || fn === sn) {
112
+ r = merkleNodeHash(p, r);
113
+ if ((fn & 1) === 0) {
114
+ while ((fn & 1) === 0 && fn !== 0) {
115
+ fn >>>= 1;
116
+ sn >>>= 1;
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ r = merkleNodeHash(r, p);
122
+ }
123
+ fn >>>= 1;
124
+ sn >>>= 1;
125
+ }
126
+ if (sn !== 0)
127
+ return null;
128
+ return r;
129
+ }
130
+ /**
131
+ * The whole tree over a list of leaf hashes, every subtree root computed
132
+ * once, so the paths of all N leaves cost N log N hashes in total instead of
133
+ * N per path. The split rule and the path order are merkleRoot's and
134
+ * merklePath's exactly; a test pins them equal.
135
+ */
136
+ export class MerkleTree {
137
+ size;
138
+ root;
139
+ leafHashes;
140
+ /** Subtree root by "lo:hi". */
141
+ memo = new Map();
142
+ constructor(leafHashes) {
143
+ if (leafHashes.length === 0)
144
+ throw new TypeError("a Merkle tree needs at least one leaf");
145
+ for (const h of leafHashes)
146
+ if (h.length !== 32)
147
+ throw new TypeError("a leaf hash is 32 bytes");
148
+ this.leafHashes = leafHashes;
149
+ this.size = leafHashes.length;
150
+ this.root = this.subtree(0, this.size);
151
+ }
152
+ subtree(lo, hi) {
153
+ const n = hi - lo;
154
+ if (n === 1)
155
+ return this.leafHashes[lo];
156
+ const key = `${lo}:${hi}`;
157
+ const known = this.memo.get(key);
158
+ if (known !== undefined)
159
+ return known;
160
+ const k = split(n);
161
+ const h = merkleNodeHash(this.subtree(lo, lo + k), this.subtree(lo + k, hi));
162
+ this.memo.set(key, h);
163
+ return h;
164
+ }
165
+ /** The inclusion path of the leaf at `index`, siblings from the leaf's level up. */
166
+ path(index) {
167
+ if (!Number.isInteger(index) || index < 0 || index >= this.size)
168
+ throw new RangeError("leaf index out of range");
169
+ const out = [];
170
+ const walk = (lo, hi) => {
171
+ const n = hi - lo;
172
+ if (n === 1)
173
+ return;
174
+ const k = split(n);
175
+ if (index < lo + k) {
176
+ walk(lo, lo + k);
177
+ out.push(this.subtree(lo + k, hi));
178
+ }
179
+ else {
180
+ walk(lo + k, hi);
181
+ out.push(this.subtree(lo, lo + k));
182
+ }
183
+ };
184
+ walk(0, this.size);
185
+ return out;
186
+ }
187
+ }
188
+ //# sourceMappingURL=fuse-merkle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuse-merkle.js","sourceRoot":"","sources":["../src/fuse-merkle.ts"],"names":[],"mappings":"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"}