@xyo-network/event-kit-statement-graph 1.0.0 → 2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"activeSourceWakeGrantAuthorizer.d.ts","sourceRoot":"","sources":["../../src/activeSourceWakeGrantAuthorizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,kBAAkB,EAElB,mBAAmB,EACpB,MAAM,iCAAiC,CAAA;AAexC,OAAO,KAAK,EACV,0BAA0B,EAE3B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAA;CAC9C;AA4CD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,sCAAsC,GAC9C,mBAAmB,CA8DrB"}
1
+ {"version":3,"file":"activeSourceWakeGrantAuthorizer.d.ts","sourceRoot":"","sources":["../../src/activeSourceWakeGrantAuthorizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,kBAAkB,EAElB,mBAAmB,EACpB,MAAM,iCAAiC,CAAA;AAexC,OAAO,KAAK,EACV,0BAA0B,EAE3B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAA;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAA;CAC9C;AA8CD;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,sCAAsC,GAC9C,mBAAmB,CAoErB"}
@@ -10,7 +10,10 @@ export interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {
10
10
  }
11
11
  export declare function exactFinalizedBlockHash(chain: FinalizedEventKitReplayChain, block: number, chainId: string): Promise<string>;
12
12
  /** Validates every block actually consumed by the scanner without adding a second range read. */
13
- export declare function lineageValidatingScanChain(chain: FinalizedEventKitReplayChain, chainId: string): FinalizedBlockViewer;
13
+ export declare function lineageValidatingScanChain(chain: FinalizedEventKitReplayChain, chainId: string, startAnchor?: {
14
+ readonly block: number;
15
+ readonly hash: string;
16
+ }): FinalizedBlockViewer;
14
17
  export declare function requireCurrentReplayChain(chain: FinalizedEventKitReplayChain, finalizedHead: number, chainId: string): Promise<void>;
15
18
  export {};
16
19
  //# sourceMappingURL=finalizedReplayChain.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"finalizedReplayChain.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayChain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,KAAK,UAAU,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEvC;;;;GAIG;AACH,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;CACxD;AA2BD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,EACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAoBtB;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,4BAA4B,EACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAMf"}
1
+ {"version":3,"file":"finalizedReplayChain.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayChain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,KAAK,UAAU,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEvC;;;;GAIG;AACH,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;CACxD;AA2BD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,EACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9D,oBAAoB,CA0BtB;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,4BAA4B,EACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -1 +1 @@
1
- {"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAMnF,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAM7E,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,kBAAkB,EAGnB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,oFAAoF;IACpF,IAAI,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,8BAA+B,SAAQ,gCAAgC;IACtF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAA;IACvD,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kCAAkC;IACjD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAChD,6EAA6E;IAC7E,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAA;IACxD,8FAA8F;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,QAAQ,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAA;IAC9C,MAAM,IAAI,6BAA6B,CAAA;IACvC,yFAAyF;IACzF,IAAI,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1F,sFAAsF;IACtF,MAAM,IAAI,oBAAoB,CAAA;CAC/B;AAgaD,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,iCAAiC,CAAC,CAwB5C;AAED,uFAAuF;AACvF,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,OAAO,GAChB,6BAA6B,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,CAWzF"}
1
+ {"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAMnF,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAM7E,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,kBAAkB,EAGnB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,oFAAoF;IACpF,IAAI,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,8BAA+B,SAAQ,gCAAgC;IACtF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAA;IACvD,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kCAAkC;IACjD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAChD,6EAA6E;IAC7E,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAA;IACxD,8FAA8F;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,QAAQ,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAA;IAC9C,MAAM,IAAI,6BAA6B,CAAA;IACvC,yFAAyF;IACzF,IAAI,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1F,sFAAsF;IACtF,MAAM,IAAI,oBAAoB,CAAA;CAC/B;AA+ZD,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,iCAAiC,CAAC,CAqC5C;AAED,uFAAuF;AACvF,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,OAAO,GAChB,6BAA6B,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,CAWzF"}
@@ -20,13 +20,17 @@ function exactActiveTuple(subscriptions, binding, expectedHead) {
20
20
  if (tuples.length !== 1) return;
21
21
  const tuple = tuples[0];
22
22
  const service = tuple.service.body;
23
- if (service.authorizationChainId !== binding.route.authorizationChainId || service.events.every((event) => !wakeSourcesEqual(event.source, binding.route.source))) return;
23
+ if (service.deliveryMode !== binding.route.deliveryMode || tuple.subscription.body.deliveryMode !== binding.route.deliveryMode || JSON.stringify(service.bestEffort) !== JSON.stringify(binding.route.bestEffort) || service.authorizationChainId !== binding.route.authorizationChainId || service.events.every((event) => !wakeSourcesEqual(event.source, binding.route.source))) return;
24
24
  return { selected, tuple };
25
25
  }
26
26
  function createActiveSourceWakeGrantAuthorizer(options) {
27
27
  const parsedRoute = WakeAdmissionRouteZod.parse(options.route);
28
28
  const binding = Object.freeze({
29
- route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),
29
+ route: Object.freeze({
30
+ ...parsedRoute,
31
+ source: Object.freeze(parsedRoute.source),
32
+ ...parsedRoute.bestEffort === void 0 ? {} : { bestEffort: Object.freeze(parsedRoute.bestEffort) }
33
+ }),
30
34
  publisher: NormalizedAddressZod.parse(options.publisher),
31
35
  serviceHash: HashZod.parse(options.serviceHash),
32
36
  grantHash: HashZod.parse(options.grantHash)
@@ -41,6 +45,8 @@ function createActiveSourceWakeGrantAuthorizer(options) {
41
45
  if (request.publisher !== binding.publisher || request.controller !== binding.route.controller || request.deploymentId !== binding.route.deploymentId || request.queueId !== binding.route.queueId || request.subscriptionHash !== binding.route.subscriptionHash || request.filterHash !== binding.route.filterHash) return void 0;
42
46
  const filterHash = await sourceWakeFilterHash({
43
47
  schema: SOURCE_WAKE_FILTER_PROFILE,
48
+ deliveryMode: binding.route.deliveryMode,
49
+ ...binding.route.bestEffort === void 0 ? {} : { bestEffort: binding.route.bestEffort },
44
50
  source: binding.route.source,
45
51
  fromPosition: binding.route.fromPosition,
46
52
  maxPositionsPerWake: binding.route.maxPositionsPerWake
@@ -256,18 +262,24 @@ async function exactFinalizedBlockHash(chain, block, chainId) {
256
262
  }
257
263
  return HashZod2.parse(hash);
258
264
  }
259
- function lineageValidatingScanChain(chain, chainId) {
265
+ function lineageValidatingScanChain(chain, chainId, startAnchor) {
266
+ async function validate(raw, block) {
267
+ const header = await requireBlockIdentity(chain, raw, chainId, block);
268
+ if (startAnchor !== void 0 && header.block === startAnchor.block + 1 && header.previous !== startAnchor.hash) {
269
+ throw new Error("First authorization block does not extend the reviewed start anchor");
270
+ }
271
+ }
260
272
  return {
261
273
  block: {
262
274
  async blockByNumber(block) {
263
275
  const raw = await chain.block.blockByNumber(block);
264
- await requireBlockIdentity(chain, raw, chainId, block);
276
+ await validate(raw, block);
265
277
  return raw;
266
278
  },
267
279
  ...chain.block.blocksByNumber === void 0 ? {} : {
268
280
  async blocksByNumber(high, count) {
269
281
  const values = await chain.block.blocksByNumber?.(high, count) ?? [];
270
- for (const value of values) await requireBlockIdentity(chain, value, chainId);
282
+ for (const value of values) await validate(value);
271
283
  return values;
272
284
  }
273
285
  }
@@ -331,6 +343,7 @@ var EventKitReplayCheckpointZod = z.strictObject({
331
343
  publisher: NormalizedAddressZod2,
332
344
  scan: z.union([StatementScanCheckpointZod, z.null()]),
333
345
  sourceId: z.string().min(1),
346
+ startAnchor: z.strictObject({ block: BlockNumberZod, hash: HashZod3 }).optional(),
334
347
  version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION)
335
348
  });
336
349
  var LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({
@@ -339,15 +352,16 @@ var LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({
339
352
  network: z.string().min(1),
340
353
  publisher: NormalizedAddressZod2,
341
354
  sourceId: z.string().min(1),
355
+ startAnchor: z.strictObject({ block: BlockNumberZod, hash: HashZod3 }).optional(),
342
356
  version: z.literal(2)
343
357
  });
344
358
  function checkpointIdentityError(checkpoint, identity) {
345
359
  if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`;
346
360
  if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`;
347
361
  if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`;
362
+ if (checkpoint.startAnchor?.block !== identity.startAnchor?.block || checkpoint.startAnchor?.hash !== identity.startAnchor?.hash) return "reviewed start anchor differs";
348
363
  if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`;
349
- if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`;
350
- return void 0;
364
+ return checkpoint.publisher === identity.publisher ? void 0 : `publisher ${checkpoint.publisher} != ${identity.publisher}`;
351
365
  }
352
366
  function appliedKey(record) {
353
367
  return `${record.txHash}:${record.eventHash}:${record.hashIndex}`;
@@ -392,22 +406,32 @@ function expectedClaimRecords(applied) {
392
406
  function sameClaimRecords(left, right) {
393
407
  return left.length === right.length && left.every((record, index) => {
394
408
  const candidate = right[index];
395
- if (candidate === void 0) return false;
396
- return record.declaredObjectSchema === candidate.declaredObjectSchema && record.firstBlock === candidate.firstBlock && record.firstEventHash === candidate.firstEventHash && record.lastBlock === candidate.lastBlock && record.objectHash === candidate.objectHash && normalizeAddress2(record.source) === normalizeAddress2(candidate.source) && normalizeAddress2(record.subject) === normalizeAddress2(candidate.subject);
409
+ return candidate?.objectHash === record.objectHash && record.declaredObjectSchema === candidate.declaredObjectSchema && record.firstBlock === candidate.firstBlock && record.firstEventHash === candidate.firstEventHash && record.lastBlock === candidate.lastBlock && normalizeAddress2(record.source) === normalizeAddress2(candidate.source) && normalizeAddress2(record.subject) === normalizeAddress2(candidate.subject);
397
410
  });
398
411
  }
412
+ function emptyReviewedStart(checkpoint) {
413
+ const anchor = checkpoint.startAnchor;
414
+ return anchor?.block === checkpoint.indexedThrough && anchor?.hash === checkpoint.indexedThroughHash && checkpoint.scan === null && checkpoint.applied.length === 0 && checkpoint.bodies.length === 0;
415
+ }
416
+ function startAnchorIntegrityError(checkpoint) {
417
+ const anchor = checkpoint.startAnchor;
418
+ return anchor !== void 0 && (anchor.block + 1 !== checkpoint.floorBlock || !Number.isSafeInteger(anchor.block + 1)) ? "reviewed start anchor must immediately precede the floor block" : void 0;
419
+ }
399
420
  function progressIntegrityError(checkpoint) {
400
421
  const { indexedThrough, indexedThroughHash } = checkpoint;
401
422
  if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {
402
423
  return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`;
403
424
  }
404
- if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {
425
+ const anchorError = startAnchorIntegrityError(checkpoint);
426
+ if (anchorError !== void 0) return anchorError;
427
+ const emptyAnchored = emptyReviewedStart(checkpoint);
428
+ if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock && !emptyAnchored) {
405
429
  return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`;
406
430
  }
407
431
  if (indexedThrough === null && checkpoint.scan !== null) {
408
432
  return "scan checkpoint exists before floorBlock has been indexed";
409
433
  }
410
- if (indexedThrough !== null && checkpoint.scan === null) {
434
+ if (indexedThrough !== null && checkpoint.scan === null && !emptyAnchored) {
411
435
  return "scan checkpoint is missing for indexed state";
412
436
  }
413
437
  if (indexedThrough === null !== (indexedThroughHash === null)) {
@@ -416,10 +440,7 @@ function progressIntegrityError(checkpoint) {
416
440
  if (indexedThrough === null && checkpoint.applied.length > 0) {
417
441
  return "applied events exist before floorBlock has been indexed";
418
442
  }
419
- if (indexedThrough === null && checkpoint.bodies.length > 0) {
420
- return "resolved bodies exist before floorBlock has been indexed";
421
- }
422
- return void 0;
443
+ return indexedThrough === null && checkpoint.bodies.length > 0 ? "resolved bodies exist before floorBlock has been indexed" : void 0;
423
444
  }
424
445
  function bodySetIntegrityError(checkpoint) {
425
446
  const hashes = /* @__PURE__ */ new Set();
@@ -518,10 +539,7 @@ function scanIntegrityError(checkpoint) {
518
539
  if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {
519
540
  return "scan claim records differ from applied-event history";
520
541
  }
521
- if (scan.watermark !== void 0 && scan.watermark.block > indexedThrough) {
522
- return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`;
523
- }
524
- return watermarkIntegrityError(checkpoint);
542
+ return scan.watermark !== void 0 && scan.watermark.block > indexedThrough ? `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}` : watermarkIntegrityError(checkpoint);
525
543
  }
526
544
  function watermarkIntegrityError(checkpoint) {
527
545
  const scan = checkpoint.scan;
@@ -547,10 +565,7 @@ function watermarkIntegrityError(checkpoint) {
547
565
  const group = checkpoint.applied.filter((event) => event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx);
548
566
  const uniqueExpectedKeys = new Set(group.map(eventKey2));
549
567
  const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted();
550
- if (expectedKeys.some((key) => !actualKeys.includes(key))) {
551
- return "scan watermark group event keys omit publisher applied-event history";
552
- }
553
- return void 0;
568
+ return expectedKeys.some((key) => !actualKeys.includes(key)) ? "scan watermark group event keys omit publisher applied-event history" : void 0;
554
569
  }
555
570
  function blockedIntegrityError(checkpoint) {
556
571
  const { blocked, indexedThrough } = checkpoint;
@@ -562,10 +577,7 @@ function blockedIntegrityError(checkpoint) {
562
577
  if (blocked.atBlock > checkpoint.finalizedHead) {
563
578
  return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`;
564
579
  }
565
- if (blocked.unresolvedEvents.some((event) => event.block !== blocked.atBlock)) {
566
- return "blocked unresolved event does not belong to blocked block";
567
- }
568
- return void 0;
580
+ return blocked.unresolvedEvents.some((event) => event.block !== blocked.atBlock) ? "blocked unresolved event does not belong to blocked block" : void 0;
569
581
  }
570
582
  function checkpointIntegrityError(checkpoint) {
571
583
  return progressIntegrityError(checkpoint) ?? bodySetIntegrityError(checkpoint) ?? appliedIntegrityError(checkpoint) ?? scanIntegrityError(checkpoint) ?? blockedIntegrityError(checkpoint);
@@ -604,8 +616,7 @@ async function loadEventKitReplayCheckpoint(value, identity) {
604
616
  const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint);
605
617
  if (bodyIntegrityError !== void 0) return { detail: bodyIntegrityError, status: "corrupt" };
606
618
  const integrityError = checkpointIntegrityError(checkpoint);
607
- if (integrityError !== void 0) return { detail: integrityError, status: "corrupt" };
608
- return { checkpoint, status: "valid" };
619
+ return integrityError === void 0 ? { checkpoint, status: "valid" } : { detail: integrityError, status: "corrupt" };
609
620
  }
610
621
 
611
622
  // src/finalizedReplayController.ts
@@ -652,16 +663,17 @@ function initialCheckpoint(options) {
652
663
  applied: [],
653
664
  bodies: [],
654
665
  chainId: options.chainId,
655
- finalizedHead: 0,
666
+ finalizedHead: options.startAnchor?.block ?? 0,
656
667
  floorBlock: options.floorBlock,
657
668
  foldVersion: STATEMENT_FOLD_VERSION2,
658
- indexedThrough: null,
659
- indexedThroughHash: null,
669
+ indexedThrough: options.startAnchor?.block ?? null,
670
+ indexedThroughHash: options.startAnchor?.hash ?? null,
660
671
  network: options.network,
661
672
  objectSchemas: [...EventKitClaimedObjectSchemas],
662
673
  publisher: options.publisher,
663
674
  scan: null,
664
675
  sourceId: options.sourceId,
676
+ ...options.startAnchor === void 0 ? {} : { startAnchor: options.startAnchor },
665
677
  version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION
666
678
  });
667
679
  }
@@ -742,7 +754,7 @@ async function stageRange(options, prior, fromBlock, throughBlock, signal) {
742
754
  const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId);
743
755
  signal?.throwIfAborted();
744
756
  const result = await scanFinalizedStatements(
745
- lineageValidatingScanChain(options.chain, options.chainId),
757
+ lineageValidatingScanChain(options.chain, options.chainId, options.startAnchor),
746
758
  options.bodies,
747
759
  replayContract(options, throughBlock),
748
760
  {
@@ -862,7 +874,7 @@ var DefaultFinalizedEventKitReplayController = class {
862
874
  signal?.throwIfAborted();
863
875
  if (exact.blocked === void 0) {
864
876
  await this.#commitStaged(exact, blockedAt, finalizedHead, signal);
865
- return blockedAt === throughBlock ? false : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal);
877
+ return blockedAt !== throughBlock && await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal);
866
878
  }
867
879
  const blocked = EventKitReplayCheckpointZod.parse({
868
880
  ...this.#checkpoint,
@@ -948,10 +960,21 @@ async function createFinalizedEventKitReplayController(rawOptions) {
948
960
  network: rawOptions.network.trim(),
949
961
  publisher: NormalizedAddressZod3.parse(rawOptions.publisher),
950
962
  scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, "scanBatchSize"),
951
- sourceId: rawOptions.sourceId.trim()
963
+ sourceId: rawOptions.sourceId.trim(),
964
+ ...rawOptions.startAnchor === void 0 ? {} : { startAnchor: Object.freeze({ block: requireFloor(rawOptions.startAnchor.block), hash: HashZod4.parse(rawOptions.startAnchor.hash) }) }
952
965
  };
953
966
  if (options.network.length === 0) throw new TypeError("network must not be empty");
954
967
  if (options.sourceId.length === 0) throw new TypeError("sourceId must not be empty");
968
+ if (options.startAnchor !== void 0) {
969
+ const { block, hash } = options.startAnchor;
970
+ if (!Number.isSafeInteger(block) || block < 0 || block + 1 !== options.floorBlock) {
971
+ throw new TypeError("Authorization floor must immediately follow the reviewed start anchor");
972
+ }
973
+ const head = requireHead(await options.chain.finalization.headNumber());
974
+ if (head < block || await exactFinalizedBlockHash(options.chain, block, options.chainId) !== HashZod4.parse(hash)) {
975
+ throw new Error("Configured authorization start anchor does not match the finalized chain");
976
+ }
977
+ }
955
978
  const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options);
956
979
  if (loaded.status === "corrupt" || loaded.status === "identity-mismatch") {
957
980
  throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`);
@@ -1343,10 +1366,7 @@ function publisherSubjectViewer(viewer, publisher) {
1343
1366
  return Object.freeze({
1344
1367
  claims: async (source, query) => await filterClaims(viewer.claims(source, claimQuery(query))),
1345
1368
  claimsByObject: async (objectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),
1346
- async claimsBySubject(subject, query) {
1347
- if (!isPublisherSubject(subject, publisher)) return [];
1348
- return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)));
1349
- },
1369
+ claimsBySubject: async (subject, query) => isPublisherSubject(subject, publisher) ? await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query))) : [],
1350
1370
  event: async (txHash, eventHash) => await filterEvents(viewer.event(txHash, eventHash)),
1351
1371
  events: async (source, query) => await filterEvents(viewer.events(source, eventQuery(query))),
1352
1372
  head: async () => await viewer.head(),
@@ -1363,8 +1383,7 @@ function inactiveState(tuples, acceptances, finalizedHead) {
1363
1383
  if (tuples.some((tuple) => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead) || tuples.some((tuple) => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead) || acceptances.some((item) => subscriptionHashes.has(item.lifecycle.subscription) && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {
1364
1384
  return "revoked";
1365
1385
  }
1366
- if (tuples.every((tuple) => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return "expired";
1367
- return "inactive";
1386
+ return tuples.every((tuple) => tuple.subscription.body.expiresAtBlock <= finalizedHead) ? "expired" : "inactive";
1368
1387
  }
1369
1388
  function pendingState(tuples, acceptances, finalizedHead) {
1370
1389
  const latest = tuples.reduce((selected, candidate) => selected === void 0 || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision ? candidate : selected, void 0);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/activeSourceWakeGrantAuthorizer.ts", "../../src/checkpointViewer.ts", "../../src/eventKitSchemaPolicy.ts", "../../src/finalizedReplayController.ts", "../../src/finalizedReplayChain.ts", "../../src/replayCheckpoint.ts", "../../src/grantReadModel.ts", "../../src/handshakeReadModel.ts", "../../src/handshakeCatalog.ts", "../../src/publisherSubjectViewer.ts", "../../src/subscriptionLifecycleView.ts"],
4
- "sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.authorizationChainId !== binding.route.authorizationChainId\n || service.events.every(event => !wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims(claims.values().toArray())\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n claimsByObject: async (objectHash: StatementObjectHash): Promise<ClaimRecord[]> => claims.filter(record => record.objectHash === objectHash),\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n event: async (txHash: string, eventHash: string): Promise<AppliedEventRecord[]> => applied.filter(record => record.txHash === txHash && record.eventHash === eventHash),\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n const uniqueClaims = new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash)))\n return {\n claims: uniqueClaims.size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n unresolved: async (txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> => unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash),\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts'\nimport {\n exactFinalizedBlockHash,\n lineageValidatingScanChain,\n requireCurrentReplayChain,\n} from './finalizedReplayChain.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedEventKitReplayChain\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\n// The public REST viewer may implement a bulk range as concurrent per-block\n// requests. Stay within the resident publisher's default bounded HTTP budget.\nconst DEFAULT_SCAN_BATCH_SIZE = 16\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: null,\n indexedThroughHash: null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n const unique = new Map(records.map(record => [corruptKey(record), record]))\n return unique.values().toArray()\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const unique = new Set(values)\n return unique.values().toArray()\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return merged.values().toArray().toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return merged.entries()\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toArray()\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([\n ...objects.bodies,\n ...attachments.bodies,\n ]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n lineageValidatingScanChain(options.chain, options.chainId),\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevant = new Set([\n ...appliedByBlock.keys(),\n ...unresolvedByBlock.keys(),\n ])\n const relevantBlocks = relevant.values().toArray().toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const previous = this.#syncTail\n const result = (async () => {\n try {\n await previous\n } catch {\n // Previous sync still releases the tail; this call must run either way.\n }\n return await this.#syncOnce(options)\n })()\n this.#syncTail = (async () => {\n try {\n await result\n return true\n } catch {\n return false\n }\n })()\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt === throughBlock\n ? false\n : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const { blocked: _blocked, ...unblocked } = this.#checkpoint\n const committed = EventKitReplayCheckpointZod.parse({\n ...unblocked,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId)\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = next + (budget === 0 ? -1 : budget - 1)\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n load: async (): Promise<unknown> => value,\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport { ChainIdZod } from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk'\n\ntype Promisable<T> = PromiseLike<T> | T\n\n/**\n * Public XL1 viewers expose height-aware chain identity through `chainId(block)`.\n * Fakes and older adapters may omit it, in which case replay remains deliberately\n * restricted to a single ChainId.\n */\nexport interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {\n chainId?(block: number | 'latest'): Promisable<unknown>\n}\n\nasync function requireBlockIdentity(\n chain: FinalizedEventKitReplayChain,\n raw: unknown,\n chainId: string,\n requestedBlock?: number,\n) {\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(requestedBlock === undefined\n ? 'finalized block is unavailable'\n : `finalized block ${requestedBlock} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {\n throw new TypeError('finalized block has an invalid header')\n }\n const block = header.block\n const expectedChainId = chain.chainId === undefined\n ? chainId\n : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase())\n if ((requestedBlock !== undefined && block !== requestedBlock) || header.chain !== expectedChainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n return header\n}\n\nexport async function exactFinalizedBlockHash(\n chain: FinalizedEventKitReplayChain,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\n/** Validates every block actually consumed by the scanner without adding a second range read. */\nexport function lineageValidatingScanChain(\n chain: FinalizedEventKitReplayChain,\n chainId: string,\n): FinalizedBlockViewer {\n return {\n block: {\n async blockByNumber(block) {\n const raw = await chain.block.blockByNumber(block)\n await requireBlockIdentity(chain, raw, chainId, block)\n return raw\n },\n ...(chain.block.blocksByNumber === undefined\n ? {}\n : {\n async blocksByNumber(high: number, count: number) {\n const values = await chain.block.blocksByNumber?.(high, count) ?? []\n for (const value of values) await requireBlockIdentity(chain, value, chainId)\n return values\n },\n }),\n },\n finalization: chain.finalization,\n }\n}\n\nexport async function requireCurrentReplayChain(\n chain: FinalizedEventKitReplayChain,\n finalizedHead: number,\n chainId: string,\n): Promise<void> {\n if (chain.chainId === undefined) return\n const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase())\n if (headChainId !== chainId) {\n throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`)\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`\n return undefined\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords(records.values().toArray())\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n if (candidate === undefined) return false\n return record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && record.objectHash === candidate.objectHash\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n if (indexedThrough === null && checkpoint.bodies.length > 0) {\n return 'resolved bodies exist before floorBlock has been indexed'\n }\n return undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n if (scan.watermark !== undefined && scan.watermark.block > indexedThrough) {\n return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n }\n return watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const uniqueActualKeys = new Set(watermarkGroupEventKeys)\n const actualKeys = uniqueActualKeys.values().toArray().toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const uniqueExpectedKeys = new Set(group.map(eventKey))\n const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted()\n if (expectedKeys.some(key => !actualKeys.includes(key))) {\n return 'scan watermark group event keys omit publisher applied-event history'\n }\n return undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock)) {\n return 'blocked unresolved event does not belong to blocked block'\n }\n return undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n if (integrityError !== undefined) return { detail: integrityError, status: 'corrupt' }\n return { checkpoint, status: 'valid' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n head: async (): Promise<number> => await viewer.head(),\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const tupleBlock = subscriptionRecord.block\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const uniqueSources = new Set(\n candidateSources ?? (\n (await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source)\n ),\n )\n const sources = uniqueSources.values()\n .filter(source => !isPublisherSubject(source, query.publisher))\n .toArray()\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: tuples.values().toArray() }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = discovery.catalogs.serviceByHash.values()\n .filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n .toArray()\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n discoverPublisherService: async (query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> =>\n (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result,\n\n publisher: async (query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> => handshakeView(await handshakeLifecycle(options, query)),\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return result.values().toArray()\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: keyByHash.values().map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })).toArray(),\n serviceByHash,\n serviceLifecycles: serviceByHash.values().map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })).toArray(),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n claims: async (source: StatementSource, query?: ClaimQuery) => await filterClaims(viewer.claims(source, claimQuery(query))),\n claimsByObject: async (objectHash: StatementObjectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery) {\n if (!isPublisherSubject(subject, publisher)) return []\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))\n },\n event: async (txHash: string, eventHash: string) => await filterEvents(viewer.event(txHash, eventHash)),\n events: async (source: StatementSource, query?: AppliedEventQuery) => await filterEvents(viewer.events(source, eventQuery(query))),\n head: async () => await viewer.head(),\n object: async (objectHash: StatementObjectHash) => await viewer.object(objectHash),\n source: async (source: StatementSource) => await viewer.source(source),\n unresolved: async (txHash: string, eventHash: string) => await viewer.unresolved(txHash, eventHash),\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n if (tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return 'expired'\n return 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Infinity) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Infinity) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.deliveryMode !== binding.route.deliveryMode\n || tuple.subscription.body.deliveryMode !== binding.route.deliveryMode\n || JSON.stringify(service.bestEffort) !== JSON.stringify(binding.route.bestEffort) || service.authorizationChainId !== binding.route.authorizationChainId\n || service.events.every(event => !wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({\n ...parsedRoute,\n source: Object.freeze(parsedRoute.source),\n ...(parsedRoute.bestEffort === undefined ? {} : { bestEffort: Object.freeze(parsedRoute.bestEffort) }),\n }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n deliveryMode: binding.route.deliveryMode,\n ...(binding.route.bestEffort === undefined ? {} : { bestEffort: binding.route.bestEffort }),\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims(claims.values().toArray())\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n claimsByObject: async (objectHash: StatementObjectHash): Promise<ClaimRecord[]> => claims.filter(record => record.objectHash === objectHash),\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n event: async (txHash: string, eventHash: string): Promise<AppliedEventRecord[]> => applied.filter(record => record.txHash === txHash && record.eventHash === eventHash),\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n const uniqueClaims = new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash)))\n return {\n claims: uniqueClaims.size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n unresolved: async (txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> => unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash),\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts'\nimport {\n exactFinalizedBlockHash,\n lineageValidatingScanChain,\n requireCurrentReplayChain,\n} from './finalizedReplayChain.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedEventKitReplayChain\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\n// The public REST viewer may implement a bulk range as concurrent per-block\n// requests. Stay within the resident publisher's default bounded HTTP budget.\nconst DEFAULT_SCAN_BATCH_SIZE = 16\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: options.startAnchor?.block ?? 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: options.startAnchor?.block ?? null,\n indexedThroughHash: options.startAnchor?.hash ?? null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n ...(options.startAnchor === undefined ? {} : { startAnchor: options.startAnchor }),\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n const unique = new Map(records.map(record => [corruptKey(record), record]))\n return unique.values().toArray()\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const unique = new Set(values)\n return unique.values().toArray()\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return merged.values().toArray().toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return merged.entries()\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toArray()\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([\n ...objects.bodies,\n ...attachments.bodies,\n ]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n lineageValidatingScanChain(options.chain, options.chainId, options.startAnchor),\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevant = new Set([\n ...appliedByBlock.keys(),\n ...unresolvedByBlock.keys(),\n ])\n const relevantBlocks = relevant.values().toArray().toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const previous = this.#syncTail\n const result = (async () => {\n try {\n await previous\n } catch {\n // Previous sync still releases the tail; this call must run either way.\n }\n return await this.#syncOnce(options)\n })()\n this.#syncTail = (async () => {\n try {\n await result\n return true\n } catch {\n return false\n }\n })()\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt !== throughBlock && await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const { blocked: _blocked, ...unblocked } = this.#checkpoint\n const committed = EventKitReplayCheckpointZod.parse({\n ...unblocked,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId)\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = next + (budget === 0 ? -1 : budget - 1)\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n ...(rawOptions.startAnchor === undefined\n ? {}\n : { startAnchor: Object.freeze({ block: requireFloor(rawOptions.startAnchor.block), hash: HashZod.parse(rawOptions.startAnchor.hash) }) }),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n if (options.startAnchor !== undefined) {\n const { block, hash } = options.startAnchor\n if (!Number.isSafeInteger(block) || block < 0 || block + 1 !== options.floorBlock) {\n throw new TypeError('Authorization floor must immediately follow the reviewed start anchor')\n }\n const head = requireHead(await options.chain.finalization.headNumber())\n if (head < block || await exactFinalizedBlockHash(options.chain, block, options.chainId) !== HashZod.parse(hash)) {\n throw new Error('Configured authorization start anchor does not match the finalized chain')\n }\n }\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n load: async (): Promise<unknown> => value,\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport { ChainIdZod } from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk'\n\ntype Promisable<T> = PromiseLike<T> | T\n\n/**\n * Public XL1 viewers expose height-aware chain identity through `chainId(block)`.\n * Fakes and older adapters may omit it, in which case replay remains deliberately\n * restricted to a single ChainId.\n */\nexport interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {\n chainId?(block: number | 'latest'): Promisable<unknown>\n}\n\nasync function requireBlockIdentity(\n chain: FinalizedEventKitReplayChain,\n raw: unknown,\n chainId: string,\n requestedBlock?: number,\n) {\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(requestedBlock === undefined\n ? 'finalized block is unavailable'\n : `finalized block ${requestedBlock} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {\n throw new TypeError('finalized block has an invalid header')\n }\n const block = header.block\n const expectedChainId = chain.chainId === undefined\n ? chainId\n : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase())\n if ((requestedBlock !== undefined && block !== requestedBlock) || header.chain !== expectedChainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n return header\n}\n\nexport async function exactFinalizedBlockHash(\n chain: FinalizedEventKitReplayChain,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\n/** Validates every block actually consumed by the scanner without adding a second range read. */\nexport function lineageValidatingScanChain(\n chain: FinalizedEventKitReplayChain,\n chainId: string,\n startAnchor?: { readonly block: number; readonly hash: string },\n): FinalizedBlockViewer {\n async function validate(raw: unknown, block?: number) {\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n if (startAnchor !== undefined && header.block === startAnchor.block + 1 && header.previous !== startAnchor.hash) {\n throw new Error('First authorization block does not extend the reviewed start anchor')\n }\n }\n return {\n block: {\n async blockByNumber(block) {\n const raw = await chain.block.blockByNumber(block)\n await validate(raw, block)\n return raw\n },\n ...(chain.block.blocksByNumber === undefined\n ? {}\n : {\n async blocksByNumber(high: number, count: number) {\n const values = await chain.block.blocksByNumber?.(high, count) ?? []\n for (const value of values) await validate(value)\n return values\n },\n }),\n },\n finalization: chain.finalization,\n }\n}\n\nexport async function requireCurrentReplayChain(\n chain: FinalizedEventKitReplayChain,\n finalizedHead: number,\n chainId: string,\n): Promise<void> {\n if (chain.chainId === undefined) return\n const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase())\n if (headChainId !== chainId) {\n throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`)\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n startAnchor: z.strictObject({ block: BlockNumberZod, hash: HashZod }).optional(),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n readonly startAnchor?: { readonly block: number; readonly hash: string }\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n startAnchor: z.strictObject({ block: BlockNumberZod, hash: HashZod }).optional(),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.startAnchor?.block !== identity.startAnchor?.block || checkpoint.startAnchor?.hash !== identity.startAnchor?.hash) return 'reviewed start anchor differs'\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n return checkpoint.publisher === identity.publisher ? undefined : `publisher ${checkpoint.publisher} != ${identity.publisher}`\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords(records.values().toArray())\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n return candidate?.objectHash === record.objectHash\n && record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction emptyReviewedStart(checkpoint: EventKitReplayCheckpoint): boolean {\n const anchor = checkpoint.startAnchor\n return anchor?.block === checkpoint.indexedThrough && anchor?.hash === checkpoint.indexedThroughHash\n && checkpoint.scan === null && checkpoint.applied.length === 0 && checkpoint.bodies.length === 0\n}\nfunction startAnchorIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const anchor = checkpoint.startAnchor\n return anchor !== undefined && (anchor.block + 1 !== checkpoint.floorBlock || !Number.isSafeInteger(anchor.block + 1))\n ? 'reviewed start anchor must immediately precede the floor block'\n : undefined\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n const anchorError = startAnchorIntegrityError(checkpoint)\n if (anchorError !== undefined) return anchorError\n const emptyAnchored = emptyReviewedStart(checkpoint)\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock && !emptyAnchored) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null && !emptyAnchored) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n return indexedThrough === null && checkpoint.bodies.length > 0 ? 'resolved bodies exist before floorBlock has been indexed' : undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n return scan.watermark !== undefined && scan.watermark.block > indexedThrough\n ? `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n : watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const uniqueActualKeys = new Set(watermarkGroupEventKeys)\n const actualKeys = uniqueActualKeys.values().toArray().toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const uniqueExpectedKeys = new Set(group.map(eventKey))\n const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted()\n return expectedKeys.some(key => !actualKeys.includes(key)) ? 'scan watermark group event keys omit publisher applied-event history' : undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n return blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock) ? 'blocked unresolved event does not belong to blocked block' : undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n return integrityError === undefined ? { checkpoint, status: 'valid' } : { detail: integrityError, status: 'corrupt' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n head: async (): Promise<number> => await viewer.head(),\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const tupleBlock = subscriptionRecord.block\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const uniqueSources = new Set(\n candidateSources ?? (\n (await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source)\n ),\n )\n const sources = uniqueSources.values()\n .filter(source => !isPublisherSubject(source, query.publisher))\n .toArray()\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: tuples.values().toArray() }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = discovery.catalogs.serviceByHash.values()\n .filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n .toArray()\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n discoverPublisherService: async (query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> =>\n (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result,\n\n publisher: async (query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> => handshakeView(await handshakeLifecycle(options, query)),\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return result.values().toArray()\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: keyByHash.values().map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })).toArray(),\n serviceByHash,\n serviceLifecycles: serviceByHash.values().map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })).toArray(),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n claims: async (source: StatementSource, query?: ClaimQuery) => await filterClaims(viewer.claims(source, claimQuery(query))),\n claimsByObject: async (objectHash: StatementObjectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),\n claimsBySubject: async (subject: StatementSubject, query?: ClaimQuery) => isPublisherSubject(subject, publisher) ? (await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))) : [],\n event: async (txHash: string, eventHash: string) => await filterEvents(viewer.event(txHash, eventHash)),\n events: async (source: StatementSource, query?: AppliedEventQuery) => await filterEvents(viewer.events(source, eventQuery(query))),\n head: async () => await viewer.head(),\n object: async (objectHash: StatementObjectHash) => await viewer.object(objectHash),\n source: async (source: StatementSource) => await viewer.source(source),\n unresolved: async (txHash: string, eventHash: string) => await viewer.unresolved(txHash, eventHash),\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead) ? 'expired' : 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Infinity) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Infinity) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["tuple", "HashZod", "ChainIdZod", "normalizeAddress", "NormalizedAddressZod", "WakeSubscriptionAcceptanceSchema", "STATEMENT_FOLD_VERSION", "HashZod", "HashZod", "ChainIdZod", "NormalizedAddressZod", "PayloadBuilder", "HashZod", "ChainIdZod", "NormalizedAddressZod", "compareApplied", "LegacyHexAddress", "normalizeAddress", "claimKey", "eventKey", "PayloadBuilder", "mismatch", "STATEMENT_FOLD_VERSION", "appliedKey", "HashZod", "normalizeAddress", "WakeSubscriptionAcceptanceSchema", "ChainIdZod", "NormalizedAddressZod", "HashZod", "EncryptedWakeSubscriptionSchema", "NormalizedAddressZod", "PublisherServiceSchema", "WakeGrantObjectSchema", "WakeGrantRevocationSchema", "WakeSubscriptionAcceptanceRevocationSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionRevocationSchema", "XyoAddressZod", "ChainIdZod", "NormalizedAddressZod", "PublisherEncryptionKeyRevocationSchema", "PublisherEncryptionKeySchema", "PublisherServiceRevocationSchema", "PublisherServiceSchema", "SOURCE_WAKE_EVENT_KIND", "PayloadBuilder", "XyoAddressZod", "LegacyHexAddress", "normalizeAddress", "tuple", "XyoAddressZod", "WakeGrantRevocationSchema", "WakeSubscriptionRevocationSchema", "PublisherServiceSchema", "WakeGrantObjectSchema", "EncryptedWakeSubscriptionSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionAcceptanceRevocationSchema", "tuple", "NormalizedAddressZod"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publisherSubjectViewer.d.ts","sourceRoot":"","sources":["../../src/publisherSubjectViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,yCAAyC,CAAA;AAQhD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,gBAAgB,GAC1B,oBAAoB,CAsBtB"}
1
+ {"version":3,"file":"publisherSubjectViewer.d.ts","sourceRoot":"","sources":["../../src/publisherSubjectViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,yCAAyC,CAAA;AAQhD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,gBAAgB,GAC1B,oBAAoB,CAmBtB"}
@@ -156,6 +156,10 @@ export declare const EventKitReplayCheckpointZod: z.ZodObject<{
156
156
  watermarkGroupEventKeys: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniString<string>>;
157
157
  }, z.core.$strict>, z.ZodNull]>;
158
158
  sourceId: z.ZodString;
159
+ startAnchor: z.ZodOptional<z.ZodObject<{
160
+ block: import("zod/mini").ZodMiniInt;
161
+ hash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
162
+ }, z.core.$strict>>;
159
163
  version: z.ZodLiteral<3>;
160
164
  }, z.core.$strict>;
161
165
  export type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>;
@@ -165,6 +169,10 @@ export interface EventKitReplayCheckpointIdentity {
165
169
  readonly network: string;
166
170
  readonly publisher: string;
167
171
  readonly sourceId: string;
172
+ readonly startAnchor?: {
173
+ readonly block: number;
174
+ readonly hash: string;
175
+ };
168
176
  }
169
177
  export type EventKitReplayCheckpointLoad = {
170
178
  readonly checkpoint: EventKitReplayCheckpoint;
@@ -1 +1 @@
1
- {"version":3,"file":"replayCheckpoint.d.ts","sourceRoot":"","sources":["../../src/replayCheckpoint.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAA;AAE7D,eAAO,MAAM,qBAAqB;;;kBAGhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;;kBAG/B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEpE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;kBAKhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBtC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAWD,MAAM,MAAM,4BAA4B,GAClC;IAAE,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AA0SpC,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gCAAgC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAwBvC"}
1
+ {"version":3,"file":"replayCheckpoint.d.ts","sourceRoot":"","sources":["../../src/replayCheckpoint.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAA;AAE7D,eAAO,MAAM,qBAAqB;;;kBAGhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;;kBAG/B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEpE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;kBAKhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoBtC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CACzE;AAYD,MAAM,MAAM,4BAA4B,GAClC;IAAE,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AA8SpC,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gCAAgC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAuBvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"subscriptionLifecycleView.d.ts","sourceRoot":"","sources":["../../src/subscriptionLifecycleView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,iCAAiC,CAAA;AAExC,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAK9D,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EAE1B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAA;CAClE;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,0BAA0B,CAAC,CAAA;IACpE,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAA;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAwCD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,0BAA0B,EAAE,EAC7C,WAAW,EAAE,SAAS,+BAA+B,EAAE,EACvD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,yBAAyB,EAAE,CAoD7B;AA+BD,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,+BAA+B,EAAE,CAAA;IAChE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACvD;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,4BAA4B,EAAE,CA+BhC"}
1
+ {"version":3,"file":"subscriptionLifecycleView.d.ts","sourceRoot":"","sources":["../../src/subscriptionLifecycleView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,iCAAiC,CAAA;AAExC,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAK9D,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EAE1B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAA;CAClE;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,0BAA0B,CAAC,CAAA;IACpE,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAA;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAuCD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,0BAA0B,EAAE,EAC7C,WAAW,EAAE,SAAS,+BAA+B,EAAE,EACvD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,yBAAyB,EAAE,CAoD7B;AA+BD,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,+BAA+B,EAAE,CAAA;IAChE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACvD;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,4BAA4B,EAAE,CA+BhC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/event-kit-statement-graph",
3
- "version": "1.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Statement Graph read-model adapter for Event Kit wake grants",
5
5
  "keywords": [
6
6
  "xyo",
@@ -33,32 +33,32 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "@xyo-network/event-kit-protocol": "~1.0.0",
37
- "@xyo-network/event-kit-schemas": "~1.0.0"
36
+ "@xyo-network/event-kit-protocol": "~2.1.0",
37
+ "@xyo-network/event-kit-schemas": "~2.1.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@ariestools/lib-neutral": "~10.0.7",
41
- "@ariestools/sdk": "~9.0.0",
42
- "@ariestools/toolchain": "~10.0.7",
43
- "@ariestools/tsconfig": "~10.0.7",
40
+ "@ariestools/lib-neutral": "~10.0.8",
41
+ "@ariestools/sdk": "~9.0.1",
42
+ "@ariestools/toolchain": "~10.0.8",
43
+ "@ariestools/tsconfig": "~10.0.8",
44
44
  "@opentelemetry/api": "~1.9.1",
45
- "@xyo-network/event-kit-xl1": "~1.0.0",
46
- "@xyo-network/sdk": "~8.0.0",
47
- "@xyo-network/sdk-protocol": "~8.0.0",
48
- "@xyo-network/xl1-protocol": "~5.5.4",
49
- "@xyo-network/xl1-sdk": "~5.5.4",
50
- "@xyo-network/xl1-statement-graph-engine": "~0.5.3",
51
- "@xyo-network/xl1-statement-graph-schemas": "~0.5.3",
52
- "@xyo-network/xl1-statement-graph-sdk": "~0.5.3",
53
- "@xyo-network/xl1-statement-graph-testing": "~0.5.3",
45
+ "@xyo-network/event-kit-xl1": "~2.1.0",
46
+ "@xyo-network/sdk": "~8.0.1",
47
+ "@xyo-network/sdk-protocol": "~8.0.1",
48
+ "@xyo-network/xl1-protocol": "~5.8.0",
49
+ "@xyo-network/xl1-sdk": "~5.8.0",
50
+ "@xyo-network/xl1-statement-graph-engine": "~0.5.4",
51
+ "@xyo-network/xl1-statement-graph-schemas": "~0.5.4",
52
+ "@xyo-network/xl1-statement-graph-sdk": "~0.5.4",
53
+ "@xyo-network/xl1-statement-graph-testing": "~0.5.4",
54
54
  "ajv": "~8.20.0",
55
55
  "async-mutex": "~0.5.0",
56
56
  "eslint": "~10.11.0",
57
57
  "eslint-import-resolver-typescript": "~4.4.5",
58
58
  "ethers": "~6.17.0",
59
59
  "typescript": "~6.0.3",
60
- "vite": "~8.3.0",
61
- "vitest": "~5.0.1",
60
+ "vite": "~8.3.1",
61
+ "vitest": "~5.0.3",
62
62
  "zod": "~4.6.5"
63
63
  },
64
64
  "peerDependencies": {
@@ -66,7 +66,7 @@
66
66
  "@opentelemetry/api": "^1.9",
67
67
  "@xyo-network/sdk": "^8.0",
68
68
  "@xyo-network/sdk-protocol": "^8.0",
69
- "@xyo-network/xl1-protocol": "^5.5",
69
+ "@xyo-network/xl1-protocol": "^5.8",
70
70
  "@xyo-network/xl1-statement-graph-engine": "^0.5",
71
71
  "@xyo-network/xl1-statement-graph-schemas": "^0.5",
72
72
  "@xyo-network/xl1-statement-graph-sdk": "^0.5",