@mikeargento/bitgraph 1.9.1 → 1.10.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 (248) hide show
  1. package/README.md +21 -21
  2. package/dist/fuse-cli.js +2 -2
  3. package/dist/fuse-cli.js.map +1 -1
  4. package/dist/fuse.d.ts +15 -1
  5. package/dist/fuse.d.ts.map +1 -1
  6. package/dist/fuse.js +29 -12
  7. package/dist/fuse.js.map +1 -1
  8. package/package.json +12 -8
  9. package/src/fuse-cli.ts +2 -2
  10. package/src/fuse.ts +46 -13
  11. package/dist/__tests__/audit-anchors.test.d.ts +0 -2
  12. package/dist/__tests__/audit-anchors.test.d.ts.map +0 -1
  13. package/dist/__tests__/audit-anchors.test.js +0 -152
  14. package/dist/__tests__/audit-anchors.test.js.map +0 -1
  15. package/dist/__tests__/audit-anomalies.test.d.ts +0 -2
  16. package/dist/__tests__/audit-anomalies.test.d.ts.map +0 -1
  17. package/dist/__tests__/audit-anomalies.test.js +0 -663
  18. package/dist/__tests__/audit-anomalies.test.js.map +0 -1
  19. package/dist/__tests__/audit-attestation.test.d.ts +0 -2
  20. package/dist/__tests__/audit-attestation.test.d.ts.map +0 -1
  21. package/dist/__tests__/audit-attestation.test.js +0 -403
  22. package/dist/__tests__/audit-attestation.test.js.map +0 -1
  23. package/dist/__tests__/audit-bench-smoke.test.d.ts +0 -2
  24. package/dist/__tests__/audit-bench-smoke.test.d.ts.map +0 -1
  25. package/dist/__tests__/audit-bench-smoke.test.js +0 -87
  26. package/dist/__tests__/audit-bench-smoke.test.js.map +0 -1
  27. package/dist/__tests__/audit-boundary.test.d.ts +0 -20
  28. package/dist/__tests__/audit-boundary.test.d.ts.map +0 -1
  29. package/dist/__tests__/audit-boundary.test.js +0 -84
  30. package/dist/__tests__/audit-boundary.test.js.map +0 -1
  31. package/dist/__tests__/audit-cli.test.d.ts +0 -2
  32. package/dist/__tests__/audit-cli.test.d.ts.map +0 -1
  33. package/dist/__tests__/audit-cli.test.js +0 -239
  34. package/dist/__tests__/audit-cli.test.js.map +0 -1
  35. package/dist/__tests__/audit-dependencies.test.d.ts +0 -2
  36. package/dist/__tests__/audit-dependencies.test.d.ts.map +0 -1
  37. package/dist/__tests__/audit-dependencies.test.js +0 -116
  38. package/dist/__tests__/audit-dependencies.test.js.map +0 -1
  39. package/dist/__tests__/audit-fixtures.d.ts +0 -265
  40. package/dist/__tests__/audit-fixtures.d.ts.map +0 -1
  41. package/dist/__tests__/audit-fixtures.js +0 -511
  42. package/dist/__tests__/audit-fixtures.js.map +0 -1
  43. package/dist/__tests__/audit-ingest.test.d.ts +0 -2
  44. package/dist/__tests__/audit-ingest.test.d.ts.map +0 -1
  45. package/dist/__tests__/audit-ingest.test.js +0 -473
  46. package/dist/__tests__/audit-ingest.test.js.map +0 -1
  47. package/dist/__tests__/audit-memory-ingest.test.d.ts +0 -12
  48. package/dist/__tests__/audit-memory-ingest.test.d.ts.map +0 -1
  49. package/dist/__tests__/audit-memory-ingest.test.js +0 -135
  50. package/dist/__tests__/audit-memory-ingest.test.js.map +0 -1
  51. package/dist/__tests__/audit-property.test.d.ts +0 -2
  52. package/dist/__tests__/audit-property.test.d.ts.map +0 -1
  53. package/dist/__tests__/audit-property.test.js +0 -771
  54. package/dist/__tests__/audit-property.test.js.map +0 -1
  55. package/dist/__tests__/audit-real-fixtures.test.d.ts +0 -2
  56. package/dist/__tests__/audit-real-fixtures.test.d.ts.map +0 -1
  57. package/dist/__tests__/audit-real-fixtures.test.js +0 -132
  58. package/dist/__tests__/audit-real-fixtures.test.js.map +0 -1
  59. package/dist/__tests__/audit-real-live.test.d.ts +0 -2
  60. package/dist/__tests__/audit-real-live.test.d.ts.map +0 -1
  61. package/dist/__tests__/audit-real-live.test.js +0 -107
  62. package/dist/__tests__/audit-real-live.test.js.map +0 -1
  63. package/dist/__tests__/audit-reconstruct.test.d.ts +0 -2
  64. package/dist/__tests__/audit-reconstruct.test.d.ts.map +0 -1
  65. package/dist/__tests__/audit-reconstruct.test.js +0 -287
  66. package/dist/__tests__/audit-reconstruct.test.js.map +0 -1
  67. package/dist/__tests__/audit-report.test.d.ts +0 -2
  68. package/dist/__tests__/audit-report.test.d.ts.map +0 -1
  69. package/dist/__tests__/audit-report.test.js +0 -186
  70. package/dist/__tests__/audit-report.test.js.map +0 -1
  71. package/dist/__tests__/audit-roundtrip.test.d.ts +0 -2
  72. package/dist/__tests__/audit-roundtrip.test.d.ts.map +0 -1
  73. package/dist/__tests__/audit-roundtrip.test.js +0 -368
  74. package/dist/__tests__/audit-roundtrip.test.js.map +0 -1
  75. package/dist/__tests__/audit-temporal.test.d.ts +0 -2
  76. package/dist/__tests__/audit-temporal.test.d.ts.map +0 -1
  77. package/dist/__tests__/audit-temporal.test.js +0 -364
  78. package/dist/__tests__/audit-temporal.test.js.map +0 -1
  79. package/dist/__tests__/audit-tiers.test.d.ts +0 -2
  80. package/dist/__tests__/audit-tiers.test.d.ts.map +0 -1
  81. package/dist/__tests__/audit-tiers.test.js +0 -282
  82. package/dist/__tests__/audit-tiers.test.js.map +0 -1
  83. package/dist/__tests__/audit-witness-real.test.d.ts +0 -19
  84. package/dist/__tests__/audit-witness-real.test.d.ts.map +0 -1
  85. package/dist/__tests__/audit-witness-real.test.js +0 -82
  86. package/dist/__tests__/audit-witness-real.test.js.map +0 -1
  87. package/dist/__tests__/audit-witness.test.d.ts +0 -2
  88. package/dist/__tests__/audit-witness.test.d.ts.map +0 -1
  89. package/dist/__tests__/audit-witness.test.js +0 -308
  90. package/dist/__tests__/audit-witness.test.js.map +0 -1
  91. package/dist/__tests__/canonical.test.d.ts +0 -2
  92. package/dist/__tests__/canonical.test.d.ts.map +0 -1
  93. package/dist/__tests__/canonical.test.js +0 -162
  94. package/dist/__tests__/canonical.test.js.map +0 -1
  95. package/dist/__tests__/chain-hash-anchor.test.d.ts +0 -22
  96. package/dist/__tests__/chain-hash-anchor.test.d.ts.map +0 -1
  97. package/dist/__tests__/chain-hash-anchor.test.js +0 -55
  98. package/dist/__tests__/chain-hash-anchor.test.js.map +0 -1
  99. package/dist/__tests__/commit-service.integration.test.d.ts +0 -2
  100. package/dist/__tests__/commit-service.integration.test.d.ts.map +0 -1
  101. package/dist/__tests__/commit-service.integration.test.js +0 -95
  102. package/dist/__tests__/commit-service.integration.test.js.map +0 -1
  103. package/dist/__tests__/constructor.test.d.ts +0 -2
  104. package/dist/__tests__/constructor.test.d.ts.map +0 -1
  105. package/dist/__tests__/constructor.test.js +0 -267
  106. package/dist/__tests__/constructor.test.js.map +0 -1
  107. package/dist/__tests__/declared-proof-fixture.d.ts +0 -66
  108. package/dist/__tests__/declared-proof-fixture.d.ts.map +0 -1
  109. package/dist/__tests__/declared-proof-fixture.js +0 -66
  110. package/dist/__tests__/declared-proof-fixture.js.map +0 -1
  111. package/dist/__tests__/fuse-inline.test.d.ts +0 -2
  112. package/dist/__tests__/fuse-inline.test.d.ts.map +0 -1
  113. package/dist/__tests__/fuse-inline.test.js +0 -181
  114. package/dist/__tests__/fuse-inline.test.js.map +0 -1
  115. package/dist/__tests__/fuse-placement.test.d.ts +0 -2
  116. package/dist/__tests__/fuse-placement.test.d.ts.map +0 -1
  117. package/dist/__tests__/fuse-placement.test.js +0 -31
  118. package/dist/__tests__/fuse-placement.test.js.map +0 -1
  119. package/dist/__tests__/fuse-roundtrip.test.d.ts +0 -2
  120. package/dist/__tests__/fuse-roundtrip.test.d.ts.map +0 -1
  121. package/dist/__tests__/fuse-roundtrip.test.js +0 -241
  122. package/dist/__tests__/fuse-roundtrip.test.js.map +0 -1
  123. package/dist/__tests__/fuse-sdk.test.d.ts +0 -2
  124. package/dist/__tests__/fuse-sdk.test.d.ts.map +0 -1
  125. package/dist/__tests__/fuse-sdk.test.js +0 -117
  126. package/dist/__tests__/fuse-sdk.test.js.map +0 -1
  127. package/dist/__tests__/fuse-set-sdk.test.d.ts +0 -2
  128. package/dist/__tests__/fuse-set-sdk.test.d.ts.map +0 -1
  129. package/dist/__tests__/fuse-set-sdk.test.js +0 -721
  130. package/dist/__tests__/fuse-set-sdk.test.js.map +0 -1
  131. package/dist/__tests__/fuse-set.test.d.ts +0 -2
  132. package/dist/__tests__/fuse-set.test.d.ts.map +0 -1
  133. package/dist/__tests__/fuse-set.test.js +0 -889
  134. package/dist/__tests__/fuse-set.test.js.map +0 -1
  135. package/dist/__tests__/fuse-set2.test.d.ts +0 -2
  136. package/dist/__tests__/fuse-set2.test.d.ts.map +0 -1
  137. package/dist/__tests__/fuse-set2.test.js +0 -294
  138. package/dist/__tests__/fuse-set2.test.js.map +0 -1
  139. package/dist/__tests__/fuse-vectors.test.d.ts +0 -2
  140. package/dist/__tests__/fuse-vectors.test.d.ts.map +0 -1
  141. package/dist/__tests__/fuse-vectors.test.js +0 -175
  142. package/dist/__tests__/fuse-vectors.test.js.map +0 -1
  143. package/dist/__tests__/fuse-verify.test.d.ts +0 -2
  144. package/dist/__tests__/fuse-verify.test.d.ts.map +0 -1
  145. package/dist/__tests__/fuse-verify.test.js +0 -250
  146. package/dist/__tests__/fuse-verify.test.js.map +0 -1
  147. package/dist/__tests__/hello-world.test.d.ts +0 -2
  148. package/dist/__tests__/hello-world.test.d.ts.map +0 -1
  149. package/dist/__tests__/hello-world.test.js +0 -9
  150. package/dist/__tests__/hello-world.test.js.map +0 -1
  151. package/dist/__tests__/mock-proof-fixture.d.ts +0 -15
  152. package/dist/__tests__/mock-proof-fixture.d.ts.map +0 -1
  153. package/dist/__tests__/mock-proof-fixture.js +0 -34
  154. package/dist/__tests__/mock-proof-fixture.js.map +0 -1
  155. package/dist/__tests__/policy-enforcement.test.d.ts +0 -2
  156. package/dist/__tests__/policy-enforcement.test.d.ts.map +0 -1
  157. package/dist/__tests__/policy-enforcement.test.js +0 -188
  158. package/dist/__tests__/policy-enforcement.test.js.map +0 -1
  159. package/dist/__tests__/proof-hash-regression.test.d.ts +0 -2
  160. package/dist/__tests__/proof-hash-regression.test.d.ts.map +0 -1
  161. package/dist/__tests__/proof-hash-regression.test.js +0 -95
  162. package/dist/__tests__/proof-hash-regression.test.js.map +0 -1
  163. package/dist/__tests__/proof-hash.test.d.ts +0 -2
  164. package/dist/__tests__/proof-hash.test.d.ts.map +0 -1
  165. package/dist/__tests__/proof-hash.test.js +0 -116
  166. package/dist/__tests__/proof-hash.test.js.map +0 -1
  167. package/dist/__tests__/proof-integrity.test.d.ts +0 -2
  168. package/dist/__tests__/proof-integrity.test.d.ts.map +0 -1
  169. package/dist/__tests__/proof-integrity.test.js +0 -454
  170. package/dist/__tests__/proof-integrity.test.js.map +0 -1
  171. package/dist/__tests__/realistic-proof-fixture.d.ts +0 -56
  172. package/dist/__tests__/realistic-proof-fixture.d.ts.map +0 -1
  173. package/dist/__tests__/realistic-proof-fixture.js +0 -57
  174. package/dist/__tests__/realistic-proof-fixture.js.map +0 -1
  175. package/dist/__tests__/run.test.d.ts +0 -2
  176. package/dist/__tests__/run.test.d.ts.map +0 -1
  177. package/dist/__tests__/run.test.js +0 -178
  178. package/dist/__tests__/run.test.js.map +0 -1
  179. package/dist/__tests__/verifier.test.d.ts +0 -2
  180. package/dist/__tests__/verifier.test.d.ts.map +0 -1
  181. package/dist/__tests__/verifier.test.js +0 -531
  182. package/dist/__tests__/verifier.test.js.map +0 -1
  183. package/dist/canonical.d.ts +0 -54
  184. package/dist/canonical.d.ts.map +0 -1
  185. package/dist/canonical.js +0 -119
  186. package/dist/canonical.js.map +0 -1
  187. package/dist/proof-hash.d.ts +0 -9
  188. package/dist/proof-hash.d.ts.map +0 -1
  189. package/dist/proof-hash.js +0 -75
  190. package/dist/proof-hash.js.map +0 -1
  191. package/dist/types.d.ts +0 -705
  192. package/dist/types.d.ts.map +0 -1
  193. package/dist/types.js +0 -3
  194. package/dist/types.js.map +0 -1
  195. package/dist/verifier.d.ts +0 -27
  196. package/dist/verifier.d.ts.map +0 -1
  197. package/dist/verifier.js +0 -844
  198. package/dist/verifier.js.map +0 -1
  199. package/src/__tests__/audit-anchors.test.ts +0 -188
  200. package/src/__tests__/audit-anomalies.test.ts +0 -815
  201. package/src/__tests__/audit-attestation.test.ts +0 -529
  202. package/src/__tests__/audit-bench-smoke.test.ts +0 -108
  203. package/src/__tests__/audit-boundary.test.ts +0 -96
  204. package/src/__tests__/audit-cli.test.ts +0 -288
  205. package/src/__tests__/audit-dependencies.test.ts +0 -141
  206. package/src/__tests__/audit-fixtures.ts +0 -736
  207. package/src/__tests__/audit-ingest.test.ts +0 -575
  208. package/src/__tests__/audit-memory-ingest.test.ts +0 -156
  209. package/src/__tests__/audit-property.test.ts +0 -892
  210. package/src/__tests__/audit-real-fixtures.test.ts +0 -153
  211. package/src/__tests__/audit-real-live.test.ts +0 -128
  212. package/src/__tests__/audit-reconstruct.test.ts +0 -353
  213. package/src/__tests__/audit-report.test.ts +0 -222
  214. package/src/__tests__/audit-roundtrip.test.ts +0 -464
  215. package/src/__tests__/audit-temporal.test.ts +0 -446
  216. package/src/__tests__/audit-tiers.test.ts +0 -343
  217. package/src/__tests__/audit-witness-real.test.ts +0 -92
  218. package/src/__tests__/audit-witness.test.ts +0 -345
  219. package/src/__tests__/canonical.test.ts +0 -253
  220. package/src/__tests__/chain-hash-anchor.test.ts +0 -67
  221. package/src/__tests__/commit-service.integration.test.ts +0 -117
  222. package/src/__tests__/constructor.test.ts +0 -340
  223. package/src/__tests__/declared-proof-fixture.ts +0 -65
  224. package/src/__tests__/fuse-inline.test.ts +0 -211
  225. package/src/__tests__/fuse-placement.test.ts +0 -32
  226. package/src/__tests__/fuse-roundtrip.test.ts +0 -243
  227. package/src/__tests__/fuse-sdk.test.ts +0 -142
  228. package/src/__tests__/fuse-set-sdk.test.ts +0 -852
  229. package/src/__tests__/fuse-set.test.ts +0 -1027
  230. package/src/__tests__/fuse-set2.test.ts +0 -343
  231. package/src/__tests__/fuse-vectors.test.ts +0 -218
  232. package/src/__tests__/fuse-verify.test.ts +0 -278
  233. package/src/__tests__/hello-world.test.ts +0 -10
  234. package/src/__tests__/mock-proof-fixture.ts +0 -36
  235. package/src/__tests__/policy-enforcement.test.ts +0 -226
  236. package/src/__tests__/proof-hash-regression.test.ts +0 -107
  237. package/src/__tests__/proof-hash.test.ts +0 -129
  238. package/src/__tests__/proof-integrity.test.ts +0 -576
  239. package/src/__tests__/real-fixtures/anchor-after-112762.json +0 -47
  240. package/src/__tests__/real-fixtures/anchor-with-ethereum-112758.json +0 -47
  241. package/src/__tests__/real-fixtures/live-proof-0.json +0 -42
  242. package/src/__tests__/real-fixtures/live-proof-1.json +0 -43
  243. package/src/__tests__/real-fixtures/live-proof-2.json +0 -43
  244. package/src/__tests__/real-fixtures/successor-112760.json +0 -38
  245. package/src/__tests__/real-fixtures/witness-25525146.json +0 -6
  246. package/src/__tests__/real-fixtures/witness-25525147.json +0 -6
  247. package/src/__tests__/realistic-proof-fixture.ts +0 -57
  248. package/src/__tests__/verifier.test.ts +0 -624
@@ -1,308 +0,0 @@
1
- // Copyright (c) Argento Computing Inc. All rights reserved. See LICENSE.
2
- /**
3
- * Anchor witness verification tests (bundle spec section 10.3).
4
- *
5
- * The synthetic header is a 20-item RLP list with the block number at
6
- * index 8 and the timestamp at index 11; its Keccak-256 hash is the
7
- * "block hash", the anchor's signed attribution.message is that hash,
8
- * and the anchor's artifact digest is SHA-256 over the hash STRING,
9
- * exactly like bitcoin-anchor.ts. Full verification yields the header
10
- * timestamp; every single-point corruption fails with its own stable
11
- * reason and confers nothing.
12
- */
13
- import { describe, it } from "node:test";
14
- import * as assert from "node:assert/strict";
15
- import { keccak_256 } from "@noble/hashes/sha3";
16
- import { sha256 } from "@noble/hashes/sha256";
17
- import { identifyAnchors, ingestBundle, verifyAnchorWitness, verifyAnchorWitnesses, verifyObservedProofs, } from "@mikeargento/bitgraph-audit";
18
- import { b64, makeAnchorProof, makeEthereumHeader, makeTempDir, proofJson, utf8, witnessJson, writeBundleDir, } from "./audit-fixtures.js";
19
- const BLOCK_NUMBER = 24800448;
20
- const TIMESTAMP = 1750000000;
21
- const HEADER = makeEthereumHeader({ blockNumber: BLOCK_NUMBER, timestamp: TIMESTAMP });
22
- const BLOCK_HASH = `0x${Buffer.from(keccak_256(HEADER.headerBytes)).toString("hex")}`;
23
- async function pipeline(files) {
24
- const dir = await makeTempDir("bg-audit-witness-");
25
- await writeBundleDir(dir, files);
26
- const ingest = await ingestBundle(dir);
27
- await verifyObservedProofs(ingest);
28
- return { ingest, anchors: identifyAnchors(ingest) };
29
- }
30
- function goodWitness() {
31
- return witnessJson({
32
- headerRlpHex: HEADER.headerRlpHex,
33
- blockNumber: BLOCK_NUMBER,
34
- blockHash: BLOCK_HASH,
35
- network: "ethereum-mainnet",
36
- });
37
- }
38
- describe("audit witness: full verification", () => {
39
- it("passes every step and yields the header timestamp as the only wall-clock evidence", async () => {
40
- const anchor = await makeAnchorProof({
41
- blockHash: BLOCK_HASH,
42
- blockNumber: String(BLOCK_NUMBER),
43
- epochId: "E-W1",
44
- counter: "4",
45
- slotCounter: "3",
46
- });
47
- const { ingest, anchors } = await pipeline({
48
- "proofs/anchor.json": proofJson(anchor.proof),
49
- "witnesses/w.json": goodWitness(),
50
- });
51
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
52
- assert.equal(analysis.outcomes.length, 1);
53
- const outcome = analysis.outcomes[0];
54
- assert.equal(outcome.verified, true);
55
- assert.equal(outcome.anchorProofHash, anchor.proofHash);
56
- assert.equal(outcome.computedBlockHash, BLOCK_HASH);
57
- assert.equal(outcome.blockNumber, String(BLOCK_NUMBER));
58
- assert.equal(outcome.timestamp, TIMESTAMP);
59
- assert.equal(outcome.reason, undefined);
60
- assert.equal(analysis.findings.length, 0);
61
- });
62
- it("compares the hash case-insensitively but binds the digest to the exact signed string", async () => {
63
- // The anchor signed an UPPERCASE hash string; the digest covers that
64
- // exact string. Step 3 lowercases for comparison, step 4 does not.
65
- const upper = `0x${BLOCK_HASH.slice(2).toUpperCase()}`;
66
- const anchor = await makeAnchorProof({
67
- blockHash: upper,
68
- blockNumber: String(BLOCK_NUMBER),
69
- epochId: "E-W2",
70
- counter: "2",
71
- });
72
- const { ingest, anchors } = await pipeline({
73
- "proofs/anchor.json": proofJson(anchor.proof),
74
- "witnesses/w.json": goodWitness(),
75
- });
76
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
77
- assert.equal(analysis.outcomes.length, 1);
78
- assert.equal(analysis.outcomes[0].verified, true);
79
- assert.equal(analysis.outcomes[0].timestamp, TIMESTAMP);
80
- });
81
- });
82
- describe("audit witness: single-point corruptions fail with distinct stable reasons", () => {
83
- it("wrong claimed blockHash: witness-claimed-hash-mismatch", async () => {
84
- const anchor = await makeAnchorProof({
85
- blockHash: BLOCK_HASH,
86
- blockNumber: String(BLOCK_NUMBER),
87
- epochId: "E-W3",
88
- counter: "2",
89
- });
90
- const wrongClaim = `0x${"ab".repeat(32)}`;
91
- const { ingest, anchors } = await pipeline({
92
- "proofs/anchor.json": proofJson(anchor.proof),
93
- "witnesses/w.json": witnessJson({
94
- headerRlpHex: HEADER.headerRlpHex,
95
- blockNumber: BLOCK_NUMBER,
96
- blockHash: wrongClaim,
97
- }),
98
- });
99
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
100
- const outcome = analysis.outcomes[0];
101
- assert.equal(outcome.verified, false);
102
- assert.equal(outcome.reason, "witness-claimed-hash-mismatch");
103
- assert.equal(outcome.timestamp, undefined, "a rejected witness confers nothing");
104
- assert.ok(analysis.findings.some((f) => f.code === "witness-claimed-hash-mismatch"));
105
- });
106
- it("wrong artifact digest: witness-digest-mismatch", async () => {
107
- // Validly signed anchor whose digest covers a different string, so the
108
- // proof itself verifies but the message-to-digest binding fails.
109
- const anchor = await makeAnchorProof({
110
- blockHash: BLOCK_HASH,
111
- blockNumber: String(BLOCK_NUMBER),
112
- epochId: "E-W4",
113
- counter: "2",
114
- digestB64: b64(sha256(utf8("some other committed artifact"))),
115
- });
116
- const { ingest, anchors } = await pipeline({
117
- "proofs/anchor.json": proofJson(anchor.proof),
118
- "witnesses/w.json": goodWitness(),
119
- });
120
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
121
- const outcome = analysis.outcomes[0];
122
- assert.equal(outcome.verified, false);
123
- assert.equal(outcome.reason, "witness-digest-mismatch");
124
- assert.equal(outcome.timestamp, undefined);
125
- });
126
- it("wrong claimed blockNumber: witness-block-number-mismatch", async () => {
127
- const anchor = await makeAnchorProof({
128
- blockHash: BLOCK_HASH,
129
- blockNumber: String(BLOCK_NUMBER),
130
- epochId: "E-W5",
131
- counter: "2",
132
- });
133
- const { ingest, anchors } = await pipeline({
134
- "proofs/anchor.json": proofJson(anchor.proof),
135
- "witnesses/w.json": witnessJson({
136
- headerRlpHex: HEADER.headerRlpHex,
137
- blockNumber: BLOCK_NUMBER + 1,
138
- blockHash: BLOCK_HASH,
139
- }),
140
- });
141
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
142
- const outcome = analysis.outcomes[0];
143
- assert.equal(outcome.verified, false);
144
- assert.equal(outcome.reason, "witness-block-number-mismatch");
145
- assert.match(outcome.detail, /witness claims blockNumber/);
146
- });
147
- it("signed Etherscan URL disagreeing with the header: witness-block-number-mismatch", async () => {
148
- const anchor = await makeAnchorProof({
149
- blockHash: BLOCK_HASH,
150
- blockNumber: String(BLOCK_NUMBER + 7),
151
- epochId: "E-W6",
152
- counter: "2",
153
- });
154
- const { ingest, anchors } = await pipeline({
155
- "proofs/anchor.json": proofJson(anchor.proof),
156
- "witnesses/w.json": goodWitness(),
157
- });
158
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
159
- const outcome = analysis.outcomes[0];
160
- assert.equal(outcome.verified, false);
161
- assert.equal(outcome.reason, "witness-block-number-mismatch");
162
- assert.match(outcome.detail, /Etherscan URL/);
163
- });
164
- it("tampered RLP header bytes: witness-hash-mismatch", async () => {
165
- const anchor = await makeAnchorProof({
166
- blockHash: BLOCK_HASH,
167
- blockNumber: String(BLOCK_NUMBER),
168
- epochId: "E-W7",
169
- counter: "2",
170
- });
171
- // Flip content bytes in the middle: still well-formed RLP, different
172
- // Keccak hash. The witness still reaches its intended anchor through
173
- // the claimed hash and fails loudly at step 3.
174
- const tampered = HEADER.headerRlpHex.slice(0, 40) +
175
- (HEADER.headerRlpHex[40] === "f" ? "e" : "f") +
176
- HEADER.headerRlpHex.slice(41);
177
- const { ingest, anchors } = await pipeline({
178
- "proofs/anchor.json": proofJson(anchor.proof),
179
- "witnesses/w.json": witnessJson({
180
- headerRlpHex: tampered,
181
- blockNumber: BLOCK_NUMBER,
182
- blockHash: BLOCK_HASH,
183
- }),
184
- });
185
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
186
- const outcome = analysis.outcomes[0];
187
- assert.equal(outcome.verified, false);
188
- assert.equal(outcome.reason, "witness-hash-mismatch");
189
- assert.equal(outcome.timestamp, undefined);
190
- });
191
- });
192
- describe("audit witness: malformed and unusable witnesses", () => {
193
- it("field violations fail with witness-malformed", async () => {
194
- const anchor = await makeAnchorProof({
195
- blockHash: BLOCK_HASH,
196
- blockNumber: String(BLOCK_NUMBER),
197
- epochId: "E-W8",
198
- counter: "2",
199
- });
200
- const { ingest, anchors } = await pipeline({
201
- "proofs/anchor.json": proofJson(anchor.proof),
202
- "witnesses/no-header.json": witnessJson({
203
- blockNumber: BLOCK_NUMBER,
204
- blockHash: BLOCK_HASH,
205
- omit: ["headerRlpHex"],
206
- }),
207
- "witnesses/string-number.json": witnessJson({
208
- headerRlpHex: HEADER.headerRlpHex,
209
- blockNumber: String(BLOCK_NUMBER),
210
- blockHash: BLOCK_HASH,
211
- }),
212
- "witnesses/bad-hash-shape.json": witnessJson({
213
- headerRlpHex: HEADER.headerRlpHex,
214
- blockNumber: BLOCK_NUMBER,
215
- blockHash: "28ed3639",
216
- }),
217
- });
218
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
219
- assert.equal(analysis.outcomes.length, 3);
220
- for (const outcome of analysis.outcomes) {
221
- assert.equal(outcome.verified, false);
222
- assert.equal(outcome.reason, "witness-malformed");
223
- assert.equal(outcome.timestamp, undefined);
224
- }
225
- });
226
- it("structurally invalid RLP fails with witness-rlp-invalid", async () => {
227
- const anchor = await makeAnchorProof({
228
- blockHash: BLOCK_HASH,
229
- blockNumber: String(BLOCK_NUMBER),
230
- epochId: "E-W9",
231
- counter: "2",
232
- });
233
- const { ingest, anchors } = await pipeline({
234
- "proofs/anchor.json": proofJson(anchor.proof),
235
- // 0xf9 declares a long list with a 2-byte length that never arrives.
236
- "witnesses/w.json": witnessJson({
237
- headerRlpHex: "0xf901",
238
- blockNumber: BLOCK_NUMBER,
239
- blockHash: BLOCK_HASH,
240
- }),
241
- });
242
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
243
- assert.equal(analysis.outcomes[0].reason, "witness-rlp-invalid");
244
- });
245
- it("a witness matching no anchor is reported witness-unmatched", async () => {
246
- const otherHeader = makeEthereumHeader({ blockNumber: 5, timestamp: 6 });
247
- const otherHash = `0x${Buffer.from(keccak_256(otherHeader.headerBytes)).toString("hex")}`;
248
- const anchor = await makeAnchorProof({
249
- blockHash: BLOCK_HASH,
250
- blockNumber: String(BLOCK_NUMBER),
251
- epochId: "E-W10",
252
- counter: "2",
253
- });
254
- const { ingest, anchors } = await pipeline({
255
- "proofs/anchor.json": proofJson(anchor.proof),
256
- "witnesses/w.json": witnessJson({
257
- headerRlpHex: otherHeader.headerRlpHex,
258
- blockNumber: 5,
259
- blockHash: otherHash,
260
- }),
261
- });
262
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
263
- const outcome = analysis.outcomes[0];
264
- assert.equal(outcome.verified, false);
265
- assert.equal(outcome.reason, "witness-unmatched");
266
- assert.equal(outcome.anchorProofHash, undefined);
267
- });
268
- it("a witness cannot rescue an invalid anchor: witness-anchor-invalid", async () => {
269
- const anchor = await makeAnchorProof({
270
- blockHash: BLOCK_HASH,
271
- blockNumber: String(BLOCK_NUMBER),
272
- epochId: "E-W11",
273
- counter: "2",
274
- });
275
- // Tamper the Ed25519 signature: the canonical identity is unchanged
276
- // (the signature is outside the signed body) but the proof is invalid.
277
- anchor.proof.signer.signatureB64 = `AA${anchor.proof.signer.signatureB64.slice(2)}`;
278
- const { ingest, anchors } = await pipeline({
279
- "proofs/anchor.json": proofJson(anchor.proof),
280
- "witnesses/w.json": goodWitness(),
281
- });
282
- const analysis = await verifyAnchorWitnesses(ingest, anchors);
283
- const outcome = analysis.outcomes[0];
284
- assert.equal(outcome.verified, false);
285
- assert.equal(outcome.reason, "witness-anchor-invalid");
286
- assert.equal(outcome.timestamp, undefined);
287
- });
288
- });
289
- describe("audit witness: direct single-pair API", () => {
290
- it("verifyAnchorWitness runs the full procedure against one anchor", async () => {
291
- const anchor = await makeAnchorProof({
292
- blockHash: BLOCK_HASH,
293
- blockNumber: String(BLOCK_NUMBER),
294
- epochId: "E-W12",
295
- counter: "2",
296
- });
297
- const { ingest } = await pipeline({
298
- "proofs/anchor.json": proofJson(anchor.proof),
299
- "witnesses/w.json": goodWitness(),
300
- });
301
- const observed = ingest.proofs.find((p) => p.proofHash === anchor.proofHash);
302
- const witnessFile = ingest.witnesses[0];
303
- const outcome = await verifyAnchorWitness(witnessFile, observed);
304
- assert.equal(outcome.verified, true);
305
- assert.equal(outcome.timestamp, TIMESTAMP);
306
- });
307
- });
308
- //# sourceMappingURL=audit-witness.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-witness.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-witness.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=canonical.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canonical.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/canonical.test.ts"],"names":[],"mappings":""}
@@ -1,162 +0,0 @@
1
- // Copyright (c) Argento Computing Inc. All rights reserved. See LICENSE.
2
- import { describe, test } from "node:test";
3
- import * as assert from "node:assert/strict";
4
- import { canonicalize, canonicalizeToString, constantTimeEqual, } from "../index.js";
5
- // ---------------------------------------------------------------------------
6
- // canonicalizeToString
7
- // ---------------------------------------------------------------------------
8
- describe("canonicalizeToString", () => {
9
- // Primitives
10
- test("null", () => assert.equal(canonicalizeToString(null), "null"));
11
- test("true", () => assert.equal(canonicalizeToString(true), "true"));
12
- test("false", () => assert.equal(canonicalizeToString(false), "false"));
13
- test("integer", () => assert.equal(canonicalizeToString(42), "42"));
14
- test("float", () => assert.equal(canonicalizeToString(3.14), "3.14"));
15
- test("negative", () => assert.equal(canonicalizeToString(-1), "-1"));
16
- test("zero", () => assert.equal(canonicalizeToString(0), "0"));
17
- test("string", () => assert.equal(canonicalizeToString("hello"), '"hello"'));
18
- test("empty string", () => assert.equal(canonicalizeToString(""), '""'));
19
- // Object key ordering
20
- test("sorts keys lexicographically", () => {
21
- assert.equal(canonicalizeToString({ z: 1, a: 2, m: 3 }), '{"a":2,"m":3,"z":1}');
22
- });
23
- test("uppercase sorts before lowercase (Unicode code-point order)", () => {
24
- assert.equal(canonicalizeToString({ b: 2, A: 1 }), '{"A":1,"b":2}');
25
- });
26
- test("sorts nested object keys recursively", () => {
27
- assert.equal(canonicalizeToString({ outer: { z: 1, a: 2 }, b: 3 }), '{"b":3,"outer":{"a":2,"z":1}}');
28
- });
29
- test("empty object", () => assert.equal(canonicalizeToString({}), "{}"));
30
- test("same output regardless of insertion order", () => {
31
- const a = { z: 1, a: 2 };
32
- const b = { a: 2, z: 1 };
33
- assert.equal(canonicalizeToString(a), canonicalizeToString(b));
34
- });
35
- // Arrays
36
- test("preserves array element order", () => {
37
- assert.equal(canonicalizeToString([3, 1, 2]), "[3,1,2]");
38
- });
39
- test("sorts keys inside array elements", () => {
40
- assert.equal(canonicalizeToString([{ b: 2, a: 1 }]), '[{"a":1,"b":2}]');
41
- });
42
- test("empty array", () => assert.equal(canonicalizeToString([]), "[]"));
43
- test("nested arrays preserve order", () => {
44
- assert.equal(canonicalizeToString([[1, 2], [3, 4]]), "[[1,2],[3,4]]");
45
- });
46
- // Undefined handling
47
- test("skips undefined values in objects", () => {
48
- const obj = { a: 1, c: 3 };
49
- obj["b"] = undefined;
50
- assert.equal(canonicalizeToString(obj), '{"a":1,"c":3}');
51
- });
52
- // Rejection of non-serializable types
53
- test("throws TypeError for undefined", () => {
54
- assert.throws(() => canonicalizeToString(undefined), TypeError);
55
- });
56
- test("throws TypeError for function", () => {
57
- assert.throws(() => canonicalizeToString((() => { })), TypeError);
58
- });
59
- test("throws TypeError for symbol", () => {
60
- assert.throws(() => canonicalizeToString(Symbol("x")), TypeError);
61
- });
62
- test("throws TypeError for BigInt", () => {
63
- assert.throws(() => canonicalizeToString(BigInt(42)), TypeError);
64
- });
65
- test("throws TypeError for BigInt inside object", () => {
66
- assert.throws(() => canonicalizeToString({ n: BigInt(1) }), TypeError);
67
- });
68
- // NaN / Infinity → null (standard JSON.stringify behavior)
69
- test("NaN serializes as null", () => {
70
- assert.equal(canonicalizeToString(NaN), "null");
71
- });
72
- test("Infinity serializes as null", () => {
73
- assert.equal(canonicalizeToString(Infinity), "null");
74
- });
75
- test("-Infinity serializes as null", () => {
76
- assert.equal(canonicalizeToString(-Infinity), "null");
77
- });
78
- // Determinism
79
- test("is deterministic across repeated calls", () => {
80
- const obj = { c: 3, b: 2, a: 1 };
81
- assert.equal(canonicalizeToString(obj), canonicalizeToString(obj));
82
- });
83
- });
84
- // ---------------------------------------------------------------------------
85
- // canonicalize
86
- // ---------------------------------------------------------------------------
87
- describe("canonicalize", () => {
88
- test("returns a Uint8Array", () => {
89
- assert.ok(canonicalize({}) instanceof Uint8Array);
90
- });
91
- test("UTF-8 encodes the canonical JSON string", () => {
92
- const bytes = canonicalize({ hello: "world" });
93
- assert.equal(new TextDecoder().decode(bytes), '{"hello":"world"}');
94
- });
95
- test("matches TextEncoder(canonicalizeToString(obj))", () => {
96
- const obj = { z: 1, a: 2 };
97
- const bytes = canonicalize(obj);
98
- const str = canonicalizeToString(obj);
99
- assert.deepEqual(bytes, new TextEncoder().encode(str));
100
- });
101
- test("empty object → two bytes ('{' and '}')", () => {
102
- assert.deepEqual(canonicalize({}), new TextEncoder().encode("{}"));
103
- });
104
- test("large payload round-trips through canonicalizeToString", () => {
105
- const large = {};
106
- for (let i = 0; i < 1000; i++)
107
- large[`key_${i}`] = i;
108
- const bytes = canonicalize(large);
109
- const str = canonicalizeToString(large);
110
- assert.deepEqual(bytes, new TextEncoder().encode(str));
111
- });
112
- test("throws TypeError for BigInt nested inside object", () => {
113
- assert.throws(() => canonicalize({ n: BigInt(1) }), TypeError);
114
- });
115
- });
116
- // ---------------------------------------------------------------------------
117
- // constantTimeEqual
118
- // ---------------------------------------------------------------------------
119
- describe("constantTimeEqual", () => {
120
- test("equal non-empty arrays", () => {
121
- assert.equal(constantTimeEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3])), true);
122
- });
123
- test("different content same length", () => {
124
- assert.equal(constantTimeEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 4])), false);
125
- });
126
- test("different lengths", () => {
127
- assert.equal(constantTimeEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2])), false);
128
- });
129
- test("empty arrays are equal", () => {
130
- assert.equal(constantTimeEqual(new Uint8Array([]), new Uint8Array([])), true);
131
- });
132
- test("empty vs non-empty", () => {
133
- assert.equal(constantTimeEqual(new Uint8Array([]), new Uint8Array([0])), false);
134
- });
135
- test("single byte equal", () => {
136
- assert.equal(constantTimeEqual(new Uint8Array([0xff]), new Uint8Array([0xff])), true);
137
- });
138
- test("single byte different", () => {
139
- assert.equal(constantTimeEqual(new Uint8Array([0xff]), new Uint8Array([0xfe])), false);
140
- });
141
- test("large equal arrays", () => {
142
- const a = new Uint8Array(1024).fill(0xab);
143
- const b = new Uint8Array(1024).fill(0xab);
144
- assert.equal(constantTimeEqual(a, b), true);
145
- });
146
- test("large arrays differing in last byte", () => {
147
- const a = new Uint8Array(1024).fill(0xab);
148
- const b = new Uint8Array(1024).fill(0xab);
149
- b[1023] = 0xac;
150
- assert.equal(constantTimeEqual(a, b), false);
151
- });
152
- test("large arrays differing in first byte", () => {
153
- const a = new Uint8Array(1024).fill(0xab);
154
- const b = new Uint8Array(1024).fill(0xab);
155
- b[0] = 0xac;
156
- assert.equal(constantTimeEqual(a, b), false);
157
- });
158
- test("all-zeros equal", () => {
159
- assert.equal(constantTimeEqual(new Uint8Array(32), new Uint8Array(32)), true);
160
- });
161
- });
162
- //# sourceMappingURL=canonical.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"canonical.test.js","sourceRoot":"","sources":["../../src/__tests__/canonical.test.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Regression: computeChainHash must exclude the anchor service's `ethereum`
3
- * field so that an Ethereum anchor can be resolved as a chain predecessor.
4
- *
5
- * Real-data fixture. `anchor-with-ethereum-112758.json` is a live Ethereum
6
- * anchor (commit 112758) exactly as it ships in an export bundle: it carries a
7
- * top-level `ethereum` { blockNumber, blockHash } field that the anchor service
8
- * appended AFTER the enclave signed it. `successor-112760.json` is the next
9
- * proof on the chain (the BitGraph whitepaper, commit 112760); its
10
- * `commit.prevB64` was computed by the enclave over the anchor as the enclave
11
- * saw it — before the `ethereum` field existed.
12
- *
13
- * The bug (latent since the anchor service began stamping `ethereum` on
14
- * 2026-04-01, exposed once the audit tool resolved prevB64 via computeChainHash
15
- * on 2026-07-10): computeChainHash hashed the whole proof minus only
16
- * `proofHash`, so the appended `ethereum` field poisoned the hash and no
17
- * successor's prevB64 could ever match. The anchor "vanished" from the chain
18
- * even though it was present in the bundle. The fix excludes `ethereum` (and
19
- * any ledger/service-added field) from the chain hash.
20
- */
21
- export {};
22
- //# sourceMappingURL=chain-hash-anchor.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chain-hash-anchor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/chain-hash-anchor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -1,55 +0,0 @@
1
- /**
2
- * Regression: computeChainHash must exclude the anchor service's `ethereum`
3
- * field so that an Ethereum anchor can be resolved as a chain predecessor.
4
- *
5
- * Real-data fixture. `anchor-with-ethereum-112758.json` is a live Ethereum
6
- * anchor (commit 112758) exactly as it ships in an export bundle: it carries a
7
- * top-level `ethereum` { blockNumber, blockHash } field that the anchor service
8
- * appended AFTER the enclave signed it. `successor-112760.json` is the next
9
- * proof on the chain (the BitGraph whitepaper, commit 112760); its
10
- * `commit.prevB64` was computed by the enclave over the anchor as the enclave
11
- * saw it — before the `ethereum` field existed.
12
- *
13
- * The bug (latent since the anchor service began stamping `ethereum` on
14
- * 2026-04-01, exposed once the audit tool resolved prevB64 via computeChainHash
15
- * on 2026-07-10): computeChainHash hashed the whole proof minus only
16
- * `proofHash`, so the appended `ethereum` field poisoned the hash and no
17
- * successor's prevB64 could ever match. The anchor "vanished" from the chain
18
- * even though it was present in the bundle. The fix excludes `ethereum` (and
19
- * any ledger/service-added field) from the chain hash.
20
- */
21
- import { describe, it } from "node:test";
22
- import * as assert from "node:assert/strict";
23
- import { readFileSync } from "node:fs";
24
- import { fileURLToPath } from "node:url";
25
- import { computeChainHash } from "@mikeargento/bitgraph-verify";
26
- function loadFixture(name) {
27
- const url = new URL(`../../src/__tests__/real-fixtures/${name}`, import.meta.url);
28
- return JSON.parse(readFileSync(fileURLToPath(url), "utf8"));
29
- }
30
- describe("computeChainHash: Ethereum anchor chain link (ethereum-field regression)", () => {
31
- const anchor = loadFixture("anchor-with-ethereum-112758.json");
32
- const successor = loadFixture("successor-112760.json");
33
- const expectedPrev = successor.commit.prevB64;
34
- it("the fixture is the real shape: anchor carries a top-level ethereum field", () => {
35
- assert.ok(Object.prototype.hasOwnProperty.call(anchor, "ethereum"));
36
- assert.equal(anchor.commit.counter, "112758");
37
- assert.equal(successor.commit.counter, "112760");
38
- });
39
- it("resolves the successor's prevB64 to the anchor, as exported (with ethereum)", () => {
40
- // The whole point: the anchor is exported WITH the ethereum field, and its
41
- // chain hash must still equal the successor's prevB64.
42
- assert.equal(computeChainHash(anchor), expectedPrev);
43
- });
44
- it("ignores the ethereum field entirely (with === without)", () => {
45
- const withoutEth = { ...anchor };
46
- delete withoutEth.ethereum;
47
- assert.equal(computeChainHash(anchor), computeChainHash(withoutEth));
48
- });
49
- it("also ignores the ledger-added proofHash field (with === without)", () => {
50
- const withoutHash = { ...anchor };
51
- delete withoutHash.proofHash;
52
- assert.equal(computeChainHash(anchor), computeChainHash(withoutHash));
53
- });
54
- });
55
- //# sourceMappingURL=chain-hash-anchor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chain-hash-anchor.test.js","sourceRoot":"","sources":["../../src/__tests__/chain-hash-anchor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAsB,MAAM,8BAA8B,CAAC;AAEpF,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,qCAAqC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,QAAQ,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACxF,MAAM,MAAM,GAAG,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACvD,MAAM,YAAY,GAAI,SAAS,CAAC,MAA8B,CAAC,OAAO,CAAC;IAEvE,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAE,MAAM,CAAC,MAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAE,SAAS,CAAC,MAA8B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,2EAA2E;QAC3E,uDAAuD;QACvD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAkC,CAAC,EAAE,YAAY,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;QAC1D,OAAO,UAAU,CAAC,QAAQ,CAAC;QAC3B,MAAM,CAAC,KAAK,CACV,gBAAgB,CAAC,MAAkC,CAAC,EACpD,gBAAgB,CAAC,UAAsC,CAAC,CACzD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,WAAW,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAC,SAAS,CAAC;QAC7B,MAAM,CAAC,KAAK,CACV,gBAAgB,CAAC,MAAkC,CAAC,EACpD,gBAAgB,CAAC,WAAuC,CAAC,CAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=commit-service.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commit-service.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/commit-service.integration.test.ts"],"names":[],"mappings":""}