@vorionsys/proof-plane 0.1.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 (41) hide show
  1. package/dist/events/event-emitter.d.ts +140 -0
  2. package/dist/events/event-emitter.d.ts.map +1 -0
  3. package/dist/events/event-emitter.js +235 -0
  4. package/dist/events/event-emitter.js.map +1 -0
  5. package/dist/events/event-signatures.d.ts +154 -0
  6. package/dist/events/event-signatures.d.ts.map +1 -0
  7. package/dist/events/event-signatures.js +302 -0
  8. package/dist/events/event-signatures.js.map +1 -0
  9. package/dist/events/event-store.d.ts +159 -0
  10. package/dist/events/event-store.d.ts.map +1 -0
  11. package/dist/events/event-store.js +36 -0
  12. package/dist/events/event-store.js.map +1 -0
  13. package/dist/events/hash-chain.d.ts +63 -0
  14. package/dist/events/hash-chain.d.ts.map +1 -0
  15. package/dist/events/hash-chain.js +135 -0
  16. package/dist/events/hash-chain.js.map +1 -0
  17. package/dist/events/index.d.ts +9 -0
  18. package/dist/events/index.d.ts.map +1 -0
  19. package/dist/events/index.js +9 -0
  20. package/dist/events/index.js.map +1 -0
  21. package/dist/events/memory-store.d.ts +82 -0
  22. package/dist/events/memory-store.d.ts.map +1 -0
  23. package/dist/events/memory-store.js +215 -0
  24. package/dist/events/memory-store.js.map +1 -0
  25. package/dist/index.d.ts +36 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +41 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/proof-plane/index.d.ts +6 -0
  30. package/dist/proof-plane/index.d.ts.map +1 -0
  31. package/dist/proof-plane/index.js +6 -0
  32. package/dist/proof-plane/index.js.map +1 -0
  33. package/dist/proof-plane/logger.d.ts +47 -0
  34. package/dist/proof-plane/logger.d.ts.map +1 -0
  35. package/dist/proof-plane/logger.js +48 -0
  36. package/dist/proof-plane/logger.js.map +1 -0
  37. package/dist/proof-plane/proof-plane.d.ts +263 -0
  38. package/dist/proof-plane/proof-plane.d.ts.map +1 -0
  39. package/dist/proof-plane/proof-plane.js +431 -0
  40. package/dist/proof-plane/proof-plane.js.map +1 -0
  41. package/package.json +48 -0
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Event Signatures - Ed25519 Digital Signatures for Proof Events
3
+ *
4
+ * Provides cryptographic signing and verification for proof events,
5
+ * ensuring authenticity and non-repudiation in the audit trail.
6
+ *
7
+ * Uses Ed25519 (EdDSA) which provides:
8
+ * - 128-bit security level
9
+ * - Small signatures (64 bytes)
10
+ * - Fast signing and verification
11
+ * - Deterministic signatures (no random nonce needed)
12
+ */
13
+ /**
14
+ * Recursively sort object keys for deterministic serialization
15
+ */
16
+ function sortObjectKeys(obj) {
17
+ if (obj === null || typeof obj !== 'object') {
18
+ return obj;
19
+ }
20
+ if (Array.isArray(obj)) {
21
+ return obj.map(sortObjectKeys);
22
+ }
23
+ const sorted = {};
24
+ for (const key of Object.keys(obj).sort()) {
25
+ sorted[key] = sortObjectKeys(obj[key]);
26
+ }
27
+ return sorted;
28
+ }
29
+ /**
30
+ * Create the signable representation of an event
31
+ */
32
+ function getSignableData(event, signedBy) {
33
+ return {
34
+ eventId: event.eventId,
35
+ eventType: event.eventType,
36
+ correlationId: event.correlationId,
37
+ agentId: event.agentId,
38
+ payload: event.payload,
39
+ previousHash: event.previousHash,
40
+ occurredAt: event.occurredAt instanceof Date
41
+ ? event.occurredAt.toISOString()
42
+ : event.occurredAt,
43
+ signedBy,
44
+ };
45
+ }
46
+ /**
47
+ * Serialize data for signing/verification
48
+ */
49
+ function serializeForSigning(data) {
50
+ const sorted = sortObjectKeys(data);
51
+ return JSON.stringify(sorted);
52
+ }
53
+ /**
54
+ * Convert ArrayBuffer to base64 string
55
+ */
56
+ function arrayBufferToBase64(buffer) {
57
+ const bytes = new Uint8Array(buffer);
58
+ let binary = '';
59
+ for (let i = 0; i < bytes.length; i++) {
60
+ binary += String.fromCharCode(bytes[i]);
61
+ }
62
+ return btoa(binary);
63
+ }
64
+ /**
65
+ * Convert base64 string to Uint8Array
66
+ */
67
+ function base64ToUint8Array(base64) {
68
+ const binary = atob(base64);
69
+ const bytes = new Uint8Array(binary.length);
70
+ for (let i = 0; i < binary.length; i++) {
71
+ bytes[i] = binary.charCodeAt(i);
72
+ }
73
+ return bytes;
74
+ }
75
+ /**
76
+ * Generate a new Ed25519 signing key pair
77
+ */
78
+ export async function generateSigningKeyPair(owner) {
79
+ const keyPair = await crypto.subtle.generateKey({
80
+ name: 'Ed25519',
81
+ }, true, // extractable
82
+ ['sign', 'verify']);
83
+ const publicKeyBuffer = await crypto.subtle.exportKey('raw', keyPair.publicKey);
84
+ const privateKeyBuffer = await crypto.subtle.exportKey('pkcs8', keyPair.privateKey);
85
+ const keyId = `ed25519-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
86
+ return {
87
+ publicKey: arrayBufferToBase64(publicKeyBuffer),
88
+ privateKey: arrayBufferToBase64(privateKeyBuffer),
89
+ keyId,
90
+ createdAt: new Date(),
91
+ owner,
92
+ };
93
+ }
94
+ /**
95
+ * Import a private key from base64 for signing
96
+ */
97
+ async function importPrivateKey(privateKeyBase64) {
98
+ const keyData = base64ToUint8Array(privateKeyBase64);
99
+ return crypto.subtle.importKey('pkcs8', keyData, { name: 'Ed25519' }, false, ['sign']);
100
+ }
101
+ /**
102
+ * Import a public key from base64 for verification
103
+ */
104
+ async function importPublicKey(publicKeyBase64) {
105
+ const keyData = base64ToUint8Array(publicKeyBase64);
106
+ return crypto.subtle.importKey('raw', keyData, { name: 'Ed25519' }, false, ['verify']);
107
+ }
108
+ /**
109
+ * Sign an event using Ed25519
110
+ */
111
+ export async function signEvent(event, privateKeyBase64, signedBy) {
112
+ const signableData = getSignableData(event, signedBy);
113
+ const serialized = serializeForSigning(signableData);
114
+ const encoder = new TextEncoder();
115
+ const data = encoder.encode(serialized);
116
+ const privateKey = await importPrivateKey(privateKeyBase64);
117
+ const signatureBuffer = await crypto.subtle.sign({ name: 'Ed25519' }, privateKey, data);
118
+ return arrayBufferToBase64(signatureBuffer);
119
+ }
120
+ /**
121
+ * Verify an event signature using Ed25519
122
+ */
123
+ export async function verifyEventSignature(event, publicKeyBase64) {
124
+ const verifiedAt = new Date();
125
+ if (!event.signature) {
126
+ return {
127
+ valid: false,
128
+ signer: event.signedBy,
129
+ error: 'Event has no signature',
130
+ verifiedAt,
131
+ };
132
+ }
133
+ if (!event.signedBy) {
134
+ return {
135
+ valid: false,
136
+ error: 'Event has no signedBy field',
137
+ verifiedAt,
138
+ };
139
+ }
140
+ try {
141
+ const signableData = getSignableData(event, event.signedBy);
142
+ const serialized = serializeForSigning(signableData);
143
+ const encoder = new TextEncoder();
144
+ const data = encoder.encode(serialized);
145
+ const publicKey = await importPublicKey(publicKeyBase64);
146
+ const signatureBytes = base64ToUint8Array(event.signature);
147
+ const isValid = await crypto.subtle.verify({ name: 'Ed25519' }, publicKey, signatureBytes, data);
148
+ return {
149
+ valid: isValid,
150
+ signer: event.signedBy,
151
+ verifiedAt,
152
+ error: isValid ? undefined : 'Signature verification failed',
153
+ };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ valid: false,
158
+ signer: event.signedBy,
159
+ error: `Verification error: ${error instanceof Error ? error.message : String(error)}`,
160
+ verifiedAt,
161
+ };
162
+ }
163
+ }
164
+ /**
165
+ * Event Signing Service - Manages signing keys and operations
166
+ */
167
+ export class EventSigningService {
168
+ serviceId;
169
+ privateKey;
170
+ keyId;
171
+ trustedKeys;
172
+ constructor(config) {
173
+ this.serviceId = config.serviceId;
174
+ this.privateKey = config.privateKey;
175
+ this.keyId = config.keyId;
176
+ this.trustedKeys = new Map();
177
+ // Add trusted keys
178
+ for (const key of config.trustedKeys ?? []) {
179
+ this.trustedKeys.set(key.owner, key);
180
+ }
181
+ }
182
+ /**
183
+ * Check if this service can sign events
184
+ */
185
+ canSign() {
186
+ return this.privateKey !== undefined;
187
+ }
188
+ /**
189
+ * Get the service ID (used in signedBy field)
190
+ */
191
+ getServiceId() {
192
+ return this.serviceId;
193
+ }
194
+ /**
195
+ * Get the key ID
196
+ */
197
+ getKeyId() {
198
+ return this.keyId;
199
+ }
200
+ /**
201
+ * Sign an event
202
+ */
203
+ async sign(event) {
204
+ if (!this.privateKey) {
205
+ throw new Error('Signing service has no private key configured');
206
+ }
207
+ return signEvent(event, this.privateKey, this.serviceId);
208
+ }
209
+ /**
210
+ * Verify an event signature
211
+ */
212
+ async verify(event) {
213
+ if (!event.signedBy) {
214
+ return {
215
+ valid: false,
216
+ error: 'Event has no signedBy field',
217
+ verifiedAt: new Date(),
218
+ };
219
+ }
220
+ // Find the public key for the signer
221
+ const trustedKey = this.trustedKeys.get(event.signedBy);
222
+ if (!trustedKey) {
223
+ return {
224
+ valid: false,
225
+ signer: event.signedBy,
226
+ error: `No trusted key found for signer: ${event.signedBy}`,
227
+ verifiedAt: new Date(),
228
+ };
229
+ }
230
+ return verifyEventSignature(event, trustedKey.publicKey);
231
+ }
232
+ /**
233
+ * Add a trusted public key
234
+ */
235
+ addTrustedKey(key) {
236
+ this.trustedKeys.set(key.owner, key);
237
+ }
238
+ /**
239
+ * Remove a trusted public key
240
+ */
241
+ removeTrustedKey(owner) {
242
+ return this.trustedKeys.delete(owner);
243
+ }
244
+ /**
245
+ * Get all trusted keys
246
+ */
247
+ getTrustedKeys() {
248
+ return Array.from(this.trustedKeys.values());
249
+ }
250
+ /**
251
+ * Check if a signer is trusted
252
+ */
253
+ isTrusted(signer) {
254
+ return this.trustedKeys.has(signer);
255
+ }
256
+ }
257
+ /**
258
+ * Create an event signing service
259
+ */
260
+ export function createSigningService(config) {
261
+ return new EventSigningService(config);
262
+ }
263
+ /**
264
+ * Verify signatures for a batch of events
265
+ */
266
+ export async function verifyEventSignatures(events, signingService) {
267
+ const results = [];
268
+ let validCount = 0;
269
+ let invalidCount = 0;
270
+ let unsignedCount = 0;
271
+ for (const event of events) {
272
+ if (!event.signature) {
273
+ unsignedCount++;
274
+ results.push({
275
+ eventId: event.eventId,
276
+ result: {
277
+ valid: false,
278
+ error: 'Event is unsigned',
279
+ verifiedAt: new Date(),
280
+ },
281
+ });
282
+ continue;
283
+ }
284
+ const result = await signingService.verify(event);
285
+ results.push({ eventId: event.eventId, result });
286
+ if (result.valid) {
287
+ validCount++;
288
+ }
289
+ else {
290
+ invalidCount++;
291
+ }
292
+ }
293
+ return {
294
+ totalEvents: events.length,
295
+ validCount,
296
+ invalidCount,
297
+ unsignedCount,
298
+ results,
299
+ success: invalidCount === 0 && (unsignedCount === 0 || events.length === 0),
300
+ };
301
+ }
302
+ //# sourceMappingURL=event-signatures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-signatures.js","sourceRoot":"","sources":["../../src/events/event-signatures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Event Store - Abstract storage interface for proof events
3
+ *
4
+ * Implementations can use in-memory storage (for testing),
5
+ * or persistent stores (PostgreSQL, Supabase, etc.).
6
+ */
7
+ import type { ProofEvent, ProofEventFilter, ProofEventSummary, ProofEventType, ShadowModeStatus } from '@vorion/contracts';
8
+ /**
9
+ * Query options for event retrieval
10
+ */
11
+ export interface EventQueryOptions {
12
+ /** Maximum number of events to return */
13
+ limit?: number;
14
+ /** Number of events to skip */
15
+ offset?: number;
16
+ /** Sort order (default: ascending by occurredAt) */
17
+ order?: 'asc' | 'desc';
18
+ /** Include event payload in results */
19
+ includePayload?: boolean;
20
+ /**
21
+ * Filter by shadow mode status
22
+ *
23
+ * If provided, only events matching these statuses are returned.
24
+ * Useful for querying unverified sandbox events:
25
+ * shadowModeOnly: ['shadow', 'testnet']
26
+ */
27
+ shadowModeOnly?: ShadowModeStatus[];
28
+ /**
29
+ * Exclude shadow mode events (production only)
30
+ *
31
+ * If true, only production events (no shadowMode or shadowMode='production')
32
+ * are returned. Used when calculating official trust scores.
33
+ *
34
+ * @default false
35
+ */
36
+ excludeShadow?: boolean;
37
+ }
38
+ /**
39
+ * Result of an event query
40
+ */
41
+ export interface EventQueryResult {
42
+ /** Retrieved events */
43
+ events: ProofEvent[];
44
+ /** Total count matching filter (before pagination) */
45
+ totalCount: number;
46
+ /** Whether there are more results */
47
+ hasMore: boolean;
48
+ }
49
+ /**
50
+ * Event statistics
51
+ */
52
+ export interface EventStats {
53
+ /** Total number of events */
54
+ totalEvents: number;
55
+ /** Events by type */
56
+ byType: Record<string, number>;
57
+ /** Events by agent */
58
+ byAgent: Record<string, number>;
59
+ /** Oldest event timestamp */
60
+ oldestEvent?: Date;
61
+ /** Newest event timestamp */
62
+ newestEvent?: Date;
63
+ /**
64
+ * Events by shadow mode status
65
+ * Tracks how many events are pending HITL verification
66
+ */
67
+ byShadowMode?: Record<ShadowModeStatus | 'production', number>;
68
+ }
69
+ /**
70
+ * Abstract interface for proof event storage
71
+ */
72
+ export interface ProofEventStore {
73
+ /**
74
+ * Append an event to the store
75
+ * Returns the stored event with recorded timestamp
76
+ */
77
+ append(event: ProofEvent): Promise<ProofEvent>;
78
+ /**
79
+ * Get an event by its ID
80
+ */
81
+ get(eventId: string): Promise<ProofEvent | null>;
82
+ /**
83
+ * Get the latest event in the chain
84
+ */
85
+ getLatest(): Promise<ProofEvent | null>;
86
+ /**
87
+ * Get the latest hash (for chaining new events)
88
+ */
89
+ getLatestHash(): Promise<string | null>;
90
+ /**
91
+ * Query events with filters
92
+ */
93
+ query(filter?: ProofEventFilter, options?: EventQueryOptions): Promise<EventQueryResult>;
94
+ /**
95
+ * Get events by correlation ID (for tracing a request)
96
+ */
97
+ getByCorrelationId(correlationId: string, options?: EventQueryOptions): Promise<ProofEvent[]>;
98
+ /**
99
+ * Get events by agent ID
100
+ */
101
+ getByAgentId(agentId: string, options?: EventQueryOptions): Promise<ProofEvent[]>;
102
+ /**
103
+ * Get events in a time range
104
+ */
105
+ getByTimeRange(from: Date, to: Date, options?: EventQueryOptions): Promise<ProofEvent[]>;
106
+ /**
107
+ * Get events by type
108
+ */
109
+ getByType(eventType: ProofEventType, options?: EventQueryOptions): Promise<ProofEvent[]>;
110
+ /**
111
+ * Get event summaries (lightweight list without payloads)
112
+ */
113
+ getSummaries(filter?: ProofEventFilter, options?: EventQueryOptions): Promise<ProofEventSummary[]>;
114
+ /**
115
+ * Get the chain of events from a starting point
116
+ * Returns events in order for chain verification
117
+ */
118
+ getChain(fromEventId?: string, limit?: number): Promise<ProofEvent[]>;
119
+ /**
120
+ * Get event count
121
+ */
122
+ count(filter?: ProofEventFilter): Promise<number>;
123
+ /**
124
+ * Get event statistics
125
+ */
126
+ getStats(): Promise<EventStats>;
127
+ /**
128
+ * Check if an event exists
129
+ */
130
+ exists(eventId: string): Promise<boolean>;
131
+ /**
132
+ * Clear all events (for testing only)
133
+ */
134
+ clear(): Promise<void>;
135
+ }
136
+ /**
137
+ * Error thrown when event storage fails
138
+ */
139
+ export declare class EventStoreError extends Error {
140
+ readonly code: EventStoreErrorCode;
141
+ readonly eventId?: string | undefined;
142
+ constructor(message: string, code: EventStoreErrorCode, eventId?: string | undefined);
143
+ }
144
+ /**
145
+ * Event store error codes
146
+ */
147
+ export declare enum EventStoreErrorCode {
148
+ /** Event already exists (duplicate ID) */
149
+ DUPLICATE_EVENT = "DUPLICATE_EVENT",
150
+ /** Event not found */
151
+ NOT_FOUND = "NOT_FOUND",
152
+ /** Invalid event data */
153
+ INVALID_EVENT = "INVALID_EVENT",
154
+ /** Chain integrity error */
155
+ CHAIN_INTEGRITY = "CHAIN_INTEGRITY",
156
+ /** Storage error */
157
+ STORAGE_ERROR = "STORAGE_ERROR"
158
+ }
159
+ //# sourceMappingURL=event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../src/events/event-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Event Store - Abstract storage interface for proof events
3
+ *
4
+ * Implementations can use in-memory storage (for testing),
5
+ * or persistent stores (PostgreSQL, Supabase, etc.).
6
+ */
7
+ /**
8
+ * Error thrown when event storage fails
9
+ */
10
+ export class EventStoreError extends Error {
11
+ code;
12
+ eventId;
13
+ constructor(message, code, eventId) {
14
+ super(message);
15
+ this.code = code;
16
+ this.eventId = eventId;
17
+ this.name = 'EventStoreError';
18
+ }
19
+ }
20
+ /**
21
+ * Event store error codes
22
+ */
23
+ export var EventStoreErrorCode;
24
+ (function (EventStoreErrorCode) {
25
+ /** Event already exists (duplicate ID) */
26
+ EventStoreErrorCode["DUPLICATE_EVENT"] = "DUPLICATE_EVENT";
27
+ /** Event not found */
28
+ EventStoreErrorCode["NOT_FOUND"] = "NOT_FOUND";
29
+ /** Invalid event data */
30
+ EventStoreErrorCode["INVALID_EVENT"] = "INVALID_EVENT";
31
+ /** Chain integrity error */
32
+ EventStoreErrorCode["CHAIN_INTEGRITY"] = "CHAIN_INTEGRITY";
33
+ /** Storage error */
34
+ EventStoreErrorCode["STORAGE_ERROR"] = "STORAGE_ERROR";
35
+ })(EventStoreErrorCode || (EventStoreErrorCode = {}));
36
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../src/events/event-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4JH;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IACA;IAHlB,YACE,OAAe,EACC,IAAyB,EACzB,OAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAqB;QACzB,YAAO,GAAP,OAAO,CAAS;QAGhC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,mBAWX;AAXD,WAAY,mBAAmB;IAC7B,0CAA0C;IAC1C,0DAAmC,CAAA;IACnC,sBAAsB;IACtB,8CAAuB,CAAA;IACvB,yBAAyB;IACzB,sDAA+B,CAAA;IAC/B,4BAA4B;IAC5B,0DAAmC,CAAA;IACnC,oBAAoB;IACpB,sDAA+B,CAAA;AACjC,CAAC,EAXW,mBAAmB,KAAnB,mBAAmB,QAW9B"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Hash Chain Utilities - Cryptographic hash chain for tamper detection
3
+ *
4
+ * Each proof event contains a hash of its contents and a reference
5
+ * to the previous event's hash, forming an immutable chain.
6
+ */
7
+ import type { ProofEvent } from '@vorion/contracts';
8
+ /**
9
+ * Create a SHA-256 hash of the given data
10
+ */
11
+ export declare function sha256(data: string): Promise<string>;
12
+ /**
13
+ * Compute the hash of an event's content
14
+ */
15
+ export declare function computeEventHash(event: Omit<ProofEvent, 'eventHash' | 'recordedAt'>): Promise<string>;
16
+ /**
17
+ * Verify that an event's hash is correct
18
+ */
19
+ export declare function verifyEventHash(event: ProofEvent): Promise<boolean>;
20
+ /**
21
+ * Verify that an event correctly chains to the previous event
22
+ */
23
+ export declare function verifyChainLink(event: ProofEvent, previousEvent: ProofEvent | null): boolean;
24
+ /**
25
+ * Verify an entire chain of events
26
+ */
27
+ export declare function verifyChain(events: ProofEvent[]): Promise<{
28
+ valid: boolean;
29
+ verifiedCount: number;
30
+ brokenAtIndex?: number;
31
+ brokenAtEventId?: string;
32
+ error?: string;
33
+ }>;
34
+ /**
35
+ * Create a genesis hash for the first event in a chain
36
+ */
37
+ export declare function getGenesisHash(): null;
38
+ /**
39
+ * Result of chain verification with detailed info
40
+ */
41
+ export interface ChainVerificationResult {
42
+ /** Is the chain valid? */
43
+ valid: boolean;
44
+ /** Number of events successfully verified */
45
+ verifiedCount: number;
46
+ /** Total events in chain */
47
+ totalEvents: number;
48
+ /** First event ID in chain */
49
+ firstEventId?: string;
50
+ /** Last event ID in chain */
51
+ lastEventId?: string;
52
+ /** Event ID where chain broke (if invalid) */
53
+ brokenAtEventId?: string;
54
+ /** Index where chain broke */
55
+ brokenAtIndex?: number;
56
+ /** Error description */
57
+ error?: string;
58
+ }
59
+ /**
60
+ * Verify a chain and return detailed results
61
+ */
62
+ export declare function verifyChainWithDetails(events: ProofEvent[]): Promise<ChainVerificationResult>;
63
+ //# sourceMappingURL=hash-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-chain.d.ts","sourceRoot":"","sources":["../../src/events/hash-chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AAEvE;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1D;AAsDD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,YAAY,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAM5F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/D,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAoCD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAanG"}