@aztec-labs/validator-client 6.0.0-nightly.20260829

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +327 -0
  2. package/dest/checkpoint_builder.d.ts +92 -0
  3. package/dest/checkpoint_builder.d.ts.map +1 -0
  4. package/dest/checkpoint_builder.js +272 -0
  5. package/dest/config.d.ts +17 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/config.js +102 -0
  8. package/dest/duties/validation_service.d.ts +65 -0
  9. package/dest/duties/validation_service.d.ts.map +1 -0
  10. package/dest/duties/validation_service.js +128 -0
  11. package/dest/factory.d.ts +41 -0
  12. package/dest/factory.d.ts.map +1 -0
  13. package/dest/factory.js +19 -0
  14. package/dest/index.d.ts +7 -0
  15. package/dest/index.d.ts.map +1 -0
  16. package/dest/index.js +6 -0
  17. package/dest/key_store/ha_key_store.d.ts +99 -0
  18. package/dest/key_store/ha_key_store.d.ts.map +1 -0
  19. package/dest/key_store/ha_key_store.js +208 -0
  20. package/dest/key_store/index.d.ts +6 -0
  21. package/dest/key_store/index.d.ts.map +1 -0
  22. package/dest/key_store/index.js +5 -0
  23. package/dest/key_store/interface.d.ts +104 -0
  24. package/dest/key_store/interface.d.ts.map +1 -0
  25. package/dest/key_store/interface.js +4 -0
  26. package/dest/key_store/local_key_store.d.ts +63 -0
  27. package/dest/key_store/local_key_store.d.ts.map +1 -0
  28. package/dest/key_store/local_key_store.js +83 -0
  29. package/dest/key_store/node_keystore_adapter.d.ts +151 -0
  30. package/dest/key_store/node_keystore_adapter.d.ts.map +1 -0
  31. package/dest/key_store/node_keystore_adapter.js +330 -0
  32. package/dest/key_store/web3signer_key_store.d.ts +74 -0
  33. package/dest/key_store/web3signer_key_store.d.ts.map +1 -0
  34. package/dest/key_store/web3signer_key_store.js +147 -0
  35. package/dest/metrics.d.ts +31 -0
  36. package/dest/metrics.d.ts.map +1 -0
  37. package/dest/metrics.js +101 -0
  38. package/dest/proposal_handler.d.ts +188 -0
  39. package/dest/proposal_handler.d.ts.map +1 -0
  40. package/dest/proposal_handler.js +1438 -0
  41. package/dest/streaming_inbox_checks.d.ts +103 -0
  42. package/dest/streaming_inbox_checks.d.ts.map +1 -0
  43. package/dest/streaming_inbox_checks.js +112 -0
  44. package/dest/validator.d.ts +137 -0
  45. package/dest/validator.d.ts.map +1 -0
  46. package/dest/validator.js +771 -0
  47. package/package.json +110 -0
  48. package/src/checkpoint_builder.ts +449 -0
  49. package/src/config.ts +130 -0
  50. package/src/duties/validation_service.ts +224 -0
  51. package/src/factory.ts +95 -0
  52. package/src/index.ts +6 -0
  53. package/src/key_store/ha_key_store.ts +268 -0
  54. package/src/key_store/index.ts +5 -0
  55. package/src/key_store/interface.ts +120 -0
  56. package/src/key_store/local_key_store.ts +104 -0
  57. package/src/key_store/node_keystore_adapter.ts +397 -0
  58. package/src/key_store/web3signer_key_store.ts +188 -0
  59. package/src/metrics.ts +150 -0
  60. package/src/proposal_handler.ts +1598 -0
  61. package/src/streaming_inbox_checks.ts +198 -0
  62. package/src/validator.ts +1125 -0
@@ -0,0 +1,103 @@
1
+ import type { Fr } from '@aztec-labs/foundation/curves/bn254';
2
+ import type { InboxBucket, InboxBucketRef, L1ToL2MessageSource } from '@aztec-labs/stdlib/messaging';
3
+ /**
4
+ * Reason a streaming-Inbox block proposal fails the per-block acceptance checks. Follows the
5
+ * handler's existing `{ isValid, reason }` string style.
6
+ */
7
+ export type StreamingBlockCheckReason = 'bucket_unknown' | 'bucket_hash_mismatch' | 'parent_bucket_unresolved' | 'bucket_moves_backwards' | 'bucket_too_new' | 'bundle_over_block_cap' | 'checkpoint_over_msg_cap';
8
+ /** The subset of the archiver's Inbox-bucket queries the per-block streaming checks need. */
9
+ export type StreamingInboxBucketSource = Pick<L1ToL2MessageSource, 'getInboxBucket' | 'getInboxBucketByTotalMsgCount' | 'getL1ToL2MessagesBetweenBuckets'>;
10
+ /** Inputs to the per-block streaming Inbox metadata checks. */
11
+ export type StreamingBlockMetadataCheckInput = {
12
+ /** Archiver Inbox-bucket queries (resolved against this node's own Inbox view). */
13
+ messageSource: Pick<StreamingInboxBucketSource, 'getInboxBucket' | 'getInboxBucketByTotalMsgCount'>;
14
+ /** The proposal's bucket reference: `bucketSeq` is the lookup hint, `inboxRollingHash` the expected commitment. */
15
+ bucketRef: InboxBucketRef | undefined;
16
+ /** Cumulative Inbox message count consumed through the parent block (its L1-to-L2 tree leaf count; 0 at genesis). */
17
+ parentTotalMsgCount: bigint;
18
+ /** Cumulative Inbox message count consumed as of the parent checkpoint; the per-checkpoint cap origin. */
19
+ checkpointStartTotalMsgCount: bigint;
20
+ /** Validation-time wall clock in seconds; the lag-eligibility anchor. */
21
+ nowSeconds: bigint;
22
+ /**
23
+ * Minimum bucket age in seconds for a bucket to be lag-eligible: one configured Ethereum slot, the same value the
24
+ * sequencer's selection uses.
25
+ *
26
+ * Age in seconds is a proxy for L1 reorg depth, and only an exact one when no L1 slot is missed: with missed slots a
27
+ * bucket can be a full Ethereum slot old and still sit in the latest L1 block. A block-depth rule would be
28
+ * stronger — require at least one later L1 block to have synced — and is implementable without new L1 state, since
29
+ * the archiver records each bucket's `l1BlockNumber`.
30
+ */
31
+ minBucketAgeSeconds: number;
32
+ /** Maximum number of messages this block may consume (`MAX_L1_TO_L2_MSGS_PER_BLOCK`). */
33
+ perBlockCap: number;
34
+ /** Maximum number of messages the checkpoint may consume in total (`MAX_L1_TO_L2_MSGS_PER_CHECKPOINT`). */
35
+ perCheckpointCap: number;
36
+ };
37
+ /** Inputs to the full per-block streaming Inbox acceptance checks, metadata plus bundle derivation. */
38
+ export type StreamingBlockCheckInput = Omit<StreamingBlockMetadataCheckInput, 'messageSource'> & {
39
+ messageSource: StreamingInboxBucketSource;
40
+ };
41
+ /** The buckets a passing block proposal consumes between; the input to bundle derivation. */
42
+ export type StreamingBlockBucketRange = {
43
+ /** The bucket the block consumes through, resolved from this node's own Inbox view. */
44
+ bucket: InboxBucket;
45
+ /** The bucket the parent block consumed through. Equal to `bucket` when the block consumes nothing. */
46
+ parentBucket: InboxBucket;
47
+ };
48
+ /** Result of the per-block streaming Inbox metadata checks. */
49
+ export type StreamingBlockMetadataCheckResult = ({
50
+ /** Every metadata check passed; the block's bundle can be derived from the returned bucket range. */
51
+ accepted: true;
52
+ } & StreamingBlockBucketRange) | {
53
+ /** A check failed; `reason` mirrors the L1 acceptance condition that would have rejected the proposal. */
54
+ accepted: false;
55
+ reason: StreamingBlockCheckReason;
56
+ };
57
+ /** Result of the per-block streaming Inbox acceptance checks. */
58
+ export type StreamingBlockCheckResult = {
59
+ /** All checks passed; `bundle` is the message-leaf bundle this block consumes, for re-execution. */
60
+ accepted: true;
61
+ bundle: Fr[];
62
+ } | {
63
+ /** A check failed; `reason` mirrors the L1 acceptance condition that would have rejected the proposal. */
64
+ accepted: false;
65
+ reason: StreamingBlockCheckReason;
66
+ };
67
+ /**
68
+ * Runs the metadata half of the per-block acceptance checks a validator applies to a streaming block proposal:
69
+ * every check that is a bounded number of point lookups against the local Inbox view, with no message data read.
70
+ * Mirrors the L1 acceptance conditions:
71
+ *
72
+ * 1. **Exists**: the referenced bucket resolves in this node's own Inbox view, and its consensus rolling hash matches
73
+ * the reference. An unknown bucket is an immediate reject here (there is no bounded wait yet); a hash
74
+ * mismatch means the wire reference disagrees with the local bucket. The reference is trusted only as a `bucketSeq`
75
+ * lookup hint — timestamp and message counts are read from the locally resolved bucket, never from the wire.
76
+ * 2. **Moves forward**: the bucket's cumulative total is at least the parent block's, so consumption never rewinds.
77
+ * Equal totals mean the block consumes nothing (empty bundle).
78
+ * 3. **Not too new**: the bucket is at least `minBucketAgeSeconds` old at validation time
79
+ * (`timestamp <= now - minBucketAgeSeconds`, inclusive — a bucket exactly that old is eligible, matching L1's
80
+ * strict `>` "too new" test).
81
+ * 4. **Caps**: the per-block message count and the running per-checkpoint total fit their respective caps.
82
+ * 5. **Parent boundary**: the parent block's cumulative total sits on a bucket boundary, so the consumed range is
83
+ * well defined.
84
+ *
85
+ * Because this phase is cheap and needs nothing off the network, a caller can run it before committing to any
86
+ * expensive work on a proposal — notably before collecting the proposal's transactions over P2P.
87
+ *
88
+ * The reject branch is a single function so a future bounded wait can wrap `bucket_unknown`.
89
+ */
90
+ export declare function checkStreamingBlockProposalMetadata(input: StreamingBlockMetadataCheckInput): Promise<StreamingBlockMetadataCheckResult>;
91
+ /**
92
+ * Derives the message-leaf bundle a streaming block proposal consumes (for re-execution): the leaves between the
93
+ * parent bucket and the proposed one, bounded by the per-block cap that
94
+ * {@link checkStreamingBlockProposalMetadata} already enforced.
95
+ */
96
+ export declare function getStreamingBlockBundle(messageSource: Pick<StreamingInboxBucketSource, 'getL1ToL2MessagesBetweenBuckets'>, range: StreamingBlockBucketRange): Promise<Fr[]>;
97
+ /**
98
+ * Runs the per-block acceptance checks a validator applies to a streaming block proposal, and derives the
99
+ * message-leaf bundle the block consumes. Composes {@link checkStreamingBlockProposalMetadata} with
100
+ * {@link getStreamingBlockBundle} for callers that have no use for running the two phases separately.
101
+ */
102
+ export declare function checkStreamingBlockProposal(input: StreamingBlockCheckInput): Promise<StreamingBlockCheckResult>;
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtaW5nX2luYm94X2NoZWNrcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0cmVhbWluZ19pbmJveF9jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXJHOzs7R0FHRztBQUNILE1BQU0sTUFBTSx5QkFBeUIsR0FDakMsZ0JBQWdCLEdBQ2hCLHNCQUFzQixHQUN0QiwwQkFBMEIsR0FDMUIsd0JBQXdCLEdBQ3hCLGdCQUFnQixHQUNoQix1QkFBdUIsR0FDdkIseUJBQXlCLENBQUM7QUFFOUIsNkZBQTZGO0FBQzdGLE1BQU0sTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQzNDLG1CQUFtQixFQUNuQixnQkFBZ0IsR0FBRywrQkFBK0IsR0FBRyxpQ0FBaUMsQ0FDdkYsQ0FBQztBQUVGLCtEQUErRDtBQUMvRCxNQUFNLE1BQU0sZ0NBQWdDLEdBQUc7SUFDN0MsbUZBQW1GO0lBQ25GLGFBQWEsRUFBRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsZ0JBQWdCLEdBQUcsK0JBQStCLENBQUMsQ0FBQztJQUNwRyxtSEFBbUg7SUFDbkgsU0FBUyxFQUFFLGNBQWMsR0FBRyxTQUFTLENBQUM7SUFDdEMscUhBQXFIO0lBQ3JILG1CQUFtQixFQUFFLE1BQU0sQ0FBQztJQUM1QiwwR0FBMEc7SUFDMUcsNEJBQTRCLEVBQUUsTUFBTSxDQUFDO0lBQ3JDLHlFQUF5RTtJQUN6RSxVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25COzs7Ozs7OztPQVFHO0lBQ0gsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO0lBQzVCLHlGQUF5RjtJQUN6RixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLDJHQUEyRztJQUMzRyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUIsQ0FBQztBQUVGLHVHQUF1RztBQUN2RyxNQUFNLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLGVBQWUsQ0FBQyxHQUFHO0lBQy9GLGFBQWEsRUFBRSwwQkFBMEIsQ0FBQztDQUMzQyxDQUFDO0FBRUYsNkZBQTZGO0FBQzdGLE1BQU0sTUFBTSx5QkFBeUIsR0FBRztJQUN0Qyx1RkFBdUY7SUFDdkYsTUFBTSxFQUFFLFdBQVcsQ0FBQztJQUNwQix1R0FBdUc7SUFDdkcsWUFBWSxFQUFFLFdBQVcsQ0FBQztDQUMzQixDQUFDO0FBRUYsK0RBQStEO0FBQy9ELE1BQU0sTUFBTSxpQ0FBaUMsR0FDekMsQ0FBQztJQUNDLHFHQUFxRztJQUNyRyxRQUFRLEVBQUUsSUFBSSxDQUFDO0NBQ2hCLEdBQUcseUJBQXlCLENBQUMsR0FDOUI7SUFDRSwwR0FBMEc7SUFDMUcsUUFBUSxFQUFFLEtBQUssQ0FBQztJQUNoQixNQUFNLEVBQUUseUJBQXlCLENBQUM7Q0FDbkMsQ0FBQztBQUVOLGlFQUFpRTtBQUNqRSxNQUFNLE1BQU0seUJBQXlCLEdBQ2pDO0lBQ0Usb0dBQW9HO0lBQ3BHLFFBQVEsRUFBRSxJQUFJLENBQUM7SUFDZixNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7Q0FDZCxHQUNEO0lBQ0UsMEdBQTBHO0lBQzFHLFFBQVEsRUFBRSxLQUFLLENBQUM7SUFDaEIsTUFBTSxFQUFFLHlCQUF5QixDQUFDO0NBQ25DLENBQUM7QUFFTjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILHdCQUFzQixtQ0FBbUMsQ0FDdkQsS0FBSyxFQUFFLGdDQUFnQyxHQUN0QyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0F3RDVDO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFnQix1QkFBdUIsQ0FDckMsYUFBYSxFQUFFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxpQ0FBaUMsQ0FBQyxFQUNsRixLQUFLLEVBQUUseUJBQXlCLEdBQy9CLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUtmO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFzQiwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBTXJIIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming_inbox_checks.d.ts","sourceRoot":"","sources":["../src/streaming_inbox_checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAErG;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GACjC,gBAAgB,GAChB,sBAAsB,GACtB,0BAA0B,GAC1B,wBAAwB,GACxB,gBAAgB,GAChB,uBAAuB,GACvB,yBAAyB,CAAC;AAE9B,6FAA6F;AAC7F,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,mBAAmB,EACnB,gBAAgB,GAAG,+BAA+B,GAAG,iCAAiC,CACvF,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG;IAC7C,mFAAmF;IACnF,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,gBAAgB,GAAG,+BAA+B,CAAC,CAAC;IACpG,mHAAmH;IACnH,SAAS,EAAE,cAAc,GAAG,SAAS,CAAC;IACtC,qHAAqH;IACrH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,0GAA0G;IAC1G,4BAA4B,EAAE,MAAM,CAAC;IACrC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uGAAuG;AACvG,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,gCAAgC,EAAE,eAAe,CAAC,GAAG;IAC/F,aAAa,EAAE,0BAA0B,CAAC;CAC3C,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,yBAAyB,GAAG;IACtC,uFAAuF;IACvF,MAAM,EAAE,WAAW,CAAC;IACpB,uGAAuG;IACvG,YAAY,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,+DAA+D;AAC/D,MAAM,MAAM,iCAAiC,GACzC,CAAC;IACC,qGAAqG;IACrG,QAAQ,EAAE,IAAI,CAAC;CAChB,GAAG,yBAAyB,CAAC,GAC9B;IACE,0GAA0G;IAC1G,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN,iEAAiE;AACjE,MAAM,MAAM,yBAAyB,GACjC;IACE,oGAAoG;IACpG,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,EAAE,EAAE,CAAC;CACd,GACD;IACE,0GAA0G;IAC1G,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,yBAAyB,CAAC;CACnC,CAAC;AAEN;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,iCAAiC,CAAC,CAwD5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,IAAI,CAAC,0BAA0B,EAAE,iCAAiC,CAAC,EAClF,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,EAAE,EAAE,CAAC,CAKf;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAMrH"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Runs the metadata half of the per-block acceptance checks a validator applies to a streaming block proposal:
3
+ * every check that is a bounded number of point lookups against the local Inbox view, with no message data read.
4
+ * Mirrors the L1 acceptance conditions:
5
+ *
6
+ * 1. **Exists**: the referenced bucket resolves in this node's own Inbox view, and its consensus rolling hash matches
7
+ * the reference. An unknown bucket is an immediate reject here (there is no bounded wait yet); a hash
8
+ * mismatch means the wire reference disagrees with the local bucket. The reference is trusted only as a `bucketSeq`
9
+ * lookup hint — timestamp and message counts are read from the locally resolved bucket, never from the wire.
10
+ * 2. **Moves forward**: the bucket's cumulative total is at least the parent block's, so consumption never rewinds.
11
+ * Equal totals mean the block consumes nothing (empty bundle).
12
+ * 3. **Not too new**: the bucket is at least `minBucketAgeSeconds` old at validation time
13
+ * (`timestamp <= now - minBucketAgeSeconds`, inclusive — a bucket exactly that old is eligible, matching L1's
14
+ * strict `>` "too new" test).
15
+ * 4. **Caps**: the per-block message count and the running per-checkpoint total fit their respective caps.
16
+ * 5. **Parent boundary**: the parent block's cumulative total sits on a bucket boundary, so the consumed range is
17
+ * well defined.
18
+ *
19
+ * Because this phase is cheap and needs nothing off the network, a caller can run it before committing to any
20
+ * expensive work on a proposal — notably before collecting the proposal's transactions over P2P.
21
+ *
22
+ * The reject branch is a single function so a future bounded wait can wrap `bucket_unknown`.
23
+ */ export async function checkStreamingBlockProposalMetadata(input) {
24
+ const { messageSource, bucketRef, parentTotalMsgCount, checkpointStartTotalMsgCount, nowSeconds, minBucketAgeSeconds, perBlockCap, perCheckpointCap } = input;
25
+ // A streaming proposal must carry a bucket reference to derive its bundle from.
26
+ if (bucketRef === undefined) {
27
+ return {
28
+ accepted: false,
29
+ reason: 'bucket_unknown'
30
+ };
31
+ }
32
+ // Check 1: exists in our own Inbox view, and the resolved rolling hash matches the reference.
33
+ const bucket = await messageSource.getInboxBucket(bucketRef.bucketSeq);
34
+ if (bucket === undefined) {
35
+ return {
36
+ accepted: false,
37
+ reason: 'bucket_unknown'
38
+ };
39
+ }
40
+ if (!bucket.inboxRollingHash.equals(bucketRef.inboxRollingHash)) {
41
+ return {
42
+ accepted: false,
43
+ reason: 'bucket_hash_mismatch'
44
+ };
45
+ }
46
+ // Check 2: consumption moves forward relative to the parent block.
47
+ if (bucket.totalMsgCount < parentTotalMsgCount) {
48
+ return {
49
+ accepted: false,
50
+ reason: 'bucket_moves_backwards'
51
+ };
52
+ }
53
+ // Check 3: the bucket is at least `minBucketAgeSeconds` old at validation time.
54
+ if (bucket.timestamp > nowSeconds - BigInt(minBucketAgeSeconds)) {
55
+ return {
56
+ accepted: false,
57
+ reason: 'bucket_too_new'
58
+ };
59
+ }
60
+ // Check 4a: the per-block message count fits the per-block cap.
61
+ const blockCount = bucket.totalMsgCount - parentTotalMsgCount;
62
+ if (blockCount > BigInt(perBlockCap)) {
63
+ return {
64
+ accepted: false,
65
+ reason: 'bundle_over_block_cap'
66
+ };
67
+ }
68
+ // Check 4b: the running per-checkpoint total fits the per-checkpoint cap.
69
+ const checkpointCount = bucket.totalMsgCount - checkpointStartTotalMsgCount;
70
+ if (checkpointCount > BigInt(perCheckpointCap)) {
71
+ return {
72
+ accepted: false,
73
+ reason: 'checkpoint_over_msg_cap'
74
+ };
75
+ }
76
+ // Check 5: the parent bucket is the one whose cumulative total equals the parent block's leaf count (messages are
77
+ // indexed compactly, with no padding); a parent whose count does not sit on a bucket boundary is unresolvable.
78
+ const parentBucket = await messageSource.getInboxBucketByTotalMsgCount(parentTotalMsgCount);
79
+ if (parentBucket === undefined) {
80
+ return {
81
+ accepted: false,
82
+ reason: 'parent_bucket_unresolved'
83
+ };
84
+ }
85
+ return {
86
+ accepted: true,
87
+ bucket,
88
+ parentBucket
89
+ };
90
+ }
91
+ /**
92
+ * Derives the message-leaf bundle a streaming block proposal consumes (for re-execution): the leaves between the
93
+ * parent bucket and the proposed one, bounded by the per-block cap that
94
+ * {@link checkStreamingBlockProposalMetadata} already enforced.
95
+ */ export function getStreamingBlockBundle(messageSource, range) {
96
+ const { bucket, parentBucket } = range;
97
+ return parentBucket.seq === bucket.seq ? Promise.resolve([]) : messageSource.getL1ToL2MessagesBetweenBuckets(parentBucket.seq, bucket.seq);
98
+ }
99
+ /**
100
+ * Runs the per-block acceptance checks a validator applies to a streaming block proposal, and derives the
101
+ * message-leaf bundle the block consumes. Composes {@link checkStreamingBlockProposalMetadata} with
102
+ * {@link getStreamingBlockBundle} for callers that have no use for running the two phases separately.
103
+ */ export async function checkStreamingBlockProposal(input) {
104
+ const metadata = await checkStreamingBlockProposalMetadata(input);
105
+ if (!metadata.accepted) {
106
+ return metadata;
107
+ }
108
+ return {
109
+ accepted: true,
110
+ bundle: await getStreamingBlockBundle(input.messageSource, metadata)
111
+ };
112
+ }
@@ -0,0 +1,137 @@
1
+ import type { BlobClientInterface } from '@aztec-labs/blob-client/client';
2
+ import type { EpochCache } from '@aztec-labs/epoch-cache';
3
+ import { CheckpointNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec-labs/foundation/branded-types';
4
+ import { Fr } from '@aztec-labs/foundation/curves/bn254';
5
+ import type { EthAddress } from '@aztec-labs/foundation/eth-address';
6
+ import { Signature } from '@aztec-labs/foundation/eth-signature';
7
+ import { type LogData, type Logger } from '@aztec-labs/foundation/log';
8
+ import { DateProvider } from '@aztec-labs/foundation/timer';
9
+ import type { KeystoreManager } from '@aztec-labs/node-keystore';
10
+ import type { P2P, PeerId } from '@aztec-labs/p2p';
11
+ import { type Watcher, type WatcherEmitter } from '@aztec-labs/slasher';
12
+ import type { AztecAddress } from '@aztec-labs/stdlib/aztec-address';
13
+ import type { CommitteeAttestationsAndSigners, L2BlockSink, L2BlockSource } from '@aztec-labs/stdlib/block';
14
+ import type { CheckpointReexecutionTracker } from '@aztec-labs/stdlib/checkpoint';
15
+ import type { ITxProvider, Validator, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec-labs/stdlib/interfaces/server';
16
+ import type { InboxBucketRef, L1ToL2MessageSource } from '@aztec-labs/stdlib/messaging';
17
+ import { type BlockProposal, type BlockProposalOptions, CheckpointAttestation, CheckpointProposal, type CheckpointProposalCore, type CheckpointProposalOptions, type ValidatedBlockProposal, type ValidatedCheckpointProposalCore } from '@aztec-labs/stdlib/p2p';
18
+ import type { CheckpointHeader } from '@aztec-labs/stdlib/rollup';
19
+ import type { BlockHeader, Tx } from '@aztec-labs/stdlib/tx';
20
+ import { type TelemetryClient, type Tracer } from '@aztec-labs/telemetry-client';
21
+ import { type SigningContext, type SlashingProtectionDatabase } from '@aztec-labs/validator-ha-signer/types';
22
+ import type { ValidatorHASigner } from '@aztec-labs/validator-ha-signer/validator-ha-signer';
23
+ import type { TypedDataDefinition } from 'viem';
24
+ import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
25
+ import type { ExtendedValidatorKeyStore } from './key_store/interface.js';
26
+ import { ProposalHandler } from './proposal_handler.js';
27
+ declare const ValidatorClient_base: new () => WatcherEmitter;
28
+ /**
29
+ * Validator Client
30
+ */
31
+ export declare class ValidatorClient extends ValidatorClient_base implements Validator, Watcher {
32
+ private keyStore;
33
+ private epochCache;
34
+ private p2pClient;
35
+ private proposalHandler;
36
+ private blockSource;
37
+ private checkpointsBuilder;
38
+ private worldState;
39
+ private l1ToL2MessageSource;
40
+ private config;
41
+ private blobClient;
42
+ private slashingProtectionSigner;
43
+ private dateProvider;
44
+ readonly tracer: Tracer;
45
+ private validationService;
46
+ private metrics;
47
+ private log;
48
+ private hasRegisteredHandlers;
49
+ /** Tracks the last block proposal we created, to detect duplicate proposal attempts. */
50
+ private lastProposedBlock?;
51
+ /** Tracks the last checkpoint proposal we created. */
52
+ private lastProposedCheckpoint?;
53
+ private lastEpochForCommitteeUpdateLoop;
54
+ private epochCacheUpdateLoop;
55
+ /** Tracks the last epoch in which each attester successfully submitted at least one attestation. */
56
+ private lastAttestedEpochByAttester;
57
+ private proposersOfInvalidBlocks;
58
+ private invalidCheckpointProposalOffenseKeys;
59
+ private oversizedProposalOffenseKeys;
60
+ private badAttestationOffenseKeys;
61
+ /** Tracks the last checkpoint proposal we attested to, to prevent equivocation. */
62
+ private lastAttestedProposal?;
63
+ protected constructor(keyStore: ExtendedValidatorKeyStore, epochCache: EpochCache, p2pClient: P2P, proposalHandler: ProposalHandler, blockSource: L2BlockSource, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, l1ToL2MessageSource: L1ToL2MessageSource, config: ValidatorClientFullConfig, blobClient: BlobClientInterface, slashingProtectionSigner: ValidatorHASigner, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: Logger);
64
+ static validateKeyStoreConfiguration(keyStoreManager: KeystoreManager, logger?: Logger): void;
65
+ private handleEpochCommitteeUpdate;
66
+ static new(config: ValidatorClientFullConfig, checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, epochCache: EpochCache, p2pClient: P2P, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: ITxProvider, keyStoreManager: KeystoreManager, blobClient: BlobClientInterface, reexecutionTracker: CheckpointReexecutionTracker, dateProvider?: DateProvider, telemetry?: TelemetryClient, slashingProtectionDb?: SlashingProtectionDatabase): Promise<ValidatorClient>;
67
+ getValidatorAddresses(): EthAddress[];
68
+ getProposalHandler(): ProposalHandler;
69
+ signWithAddress(addr: EthAddress, msg: TypedDataDefinition, context: SigningContext): Promise<Signature>;
70
+ private getSignatureContext;
71
+ getCoinbaseForAttestor(attestor: EthAddress): EthAddress;
72
+ getFeeRecipientForAttestor(attestor: EthAddress): AztecAddress;
73
+ getConfig(): ValidatorClientFullConfig;
74
+ hasProposalEquivocation(slotNumber: SlotNumber): boolean;
75
+ hasInvalidProposals(slotNumber: SlotNumber): boolean;
76
+ updateConfig(config: Partial<ValidatorClientFullConfig>): void;
77
+ reloadKeystore(newManager: KeystoreManager): void;
78
+ start(): Promise<void>;
79
+ stop(): Promise<void>;
80
+ /** Register handlers on the p2p client */
81
+ registerHandlers(): Promise<void>;
82
+ /**
83
+ * Validate a block proposal from a peer.
84
+ * Note: Validators do NOT attest to individual blocks - attestations are only for checkpoint proposals.
85
+ * @returns true if the proposal is valid, false otherwise
86
+ */
87
+ validateBlockProposal(proposal: ValidatedBlockProposal, proposalSender: PeerId): Promise<boolean>;
88
+ /**
89
+ * Validate and attest to a checkpoint proposal from a peer.
90
+ * The proposal is received as CheckpointProposalCore (without lastBlock) since
91
+ * the lastBlock is extracted and processed separately via the block handler.
92
+ * @returns Checkpoint attestations if valid, undefined otherwise
93
+ */
94
+ attestToCheckpointProposal(proposal: ValidatedCheckpointProposalCore, _proposalSender: PeerId): Promise<CheckpointAttestation[] | undefined>;
95
+ /**
96
+ * Checks if we should attest to a slot based on equivocation prevention rules.
97
+ * @returns true if we should attest, false if we should skip
98
+ */
99
+ private shouldAttestToSlot;
100
+ private createCheckpointAttestationsFromProposal;
101
+ /**
102
+ * Uploads blobs for a checkpoint to the filestore (fire and forget).
103
+ */
104
+ protected uploadBlobsForCheckpoint(proposal: CheckpointProposalCore, proposalInfo: LogData): Promise<void>;
105
+ private slashInvalidBlock;
106
+ private handleInvalidCheckpointProposal;
107
+ private slashInvalidCheckpointProposal;
108
+ private markInvalidProposalSlot;
109
+ private handleCheckpointAttestation;
110
+ private slashAttestedToInvalidCheckpointProposal;
111
+ /**
112
+ * Handle detection of an oversized block proposal: one whose index within its checkpoint lands at or
113
+ * beyond the consensus per-checkpoint block limit. A single signed proposal at an illegal index is
114
+ * self-contained evidence, so emit an invalid-block-proposal slash event for the proposer, deduped per
115
+ * (proposer, slot) since the p2p layer reports every oversized proposal it stores.
116
+ */
117
+ private handleOversizedProposal;
118
+ /**
119
+ * Handle detection of a duplicate proposal (equivocation).
120
+ * Emits a slash event when a proposer sends multiple proposals for the same position.
121
+ */
122
+ private handleDuplicateProposal;
123
+ /**
124
+ * Handle detection of a duplicate attestation (equivocation).
125
+ * Emits a slash event when an attester signs attestations for different proposals at the same slot.
126
+ */
127
+ private handleDuplicateAttestation;
128
+ createBlockProposal(blockHeader: BlockHeader, checkpointNumber: CheckpointNumber, indexWithinCheckpoint: IndexWithinCheckpoint, archive: Fr, txs: Tx[], proposerAddress: EthAddress | undefined, options?: BlockProposalOptions, bucketRef?: InboxBucketRef): Promise<BlockProposal>;
129
+ createCheckpointProposal(checkpointHeader: CheckpointHeader, archive: Fr, checkpointNumber: CheckpointNumber, feeAssetPriceModifier: bigint, lastBlockProposal: BlockProposal | undefined, proposerAddress: EthAddress | undefined, options?: CheckpointProposalOptions): Promise<CheckpointProposal>;
130
+ broadcastBlockProposal(proposal: BlockProposal): Promise<void>;
131
+ signAttestationsAndSigners(attestationsAndSigners: CommitteeAttestationsAndSigners, proposer: EthAddress, slot: SlotNumber, checkpointNumber: CheckpointNumber): Promise<Signature>;
132
+ collectOwnAttestations(proposal: CheckpointProposal, checkpointNumber: CheckpointNumber): Promise<CheckpointAttestation[]>;
133
+ collectAttestations(proposal: CheckpointProposal, required: number, deadline: Date, checkpointNumber: CheckpointNumber): Promise<CheckpointAttestation[]>;
134
+ private handleAuthRequest;
135
+ }
136
+ export {};
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFMUUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFlLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hILE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFakUsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBR3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFJVixHQUFHLEVBQ0gsTUFBTSxFQUNQLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUlMLEtBQUssT0FBTyxFQUNaLEtBQUssY0FBYyxFQUVwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sS0FBSyxFQUFFLCtCQUErQixFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RyxPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxGLE9BQU8sS0FBSyxFQUNWLFdBQVcsRUFDWCxTQUFTLEVBQ1QseUJBQXlC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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAe,qBAAqB,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AACxH,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,4BAA4B,CAAC;AAGrF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAIV,GAAG,EACH,MAAM,EACP,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,cAAc,EAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,+BAA+B,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAElF,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAE9B,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,EACrC,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAsB,MAAM,8BAA8B,CAAC;AAMrG,OAAO,EAAY,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACvH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAE7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAEhD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAG1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAGL,eAAe,EAGhB,MAAM,uBAAuB,CAAC;;AAQ/B;;GAEG;AACH,qBAAa,eAAgB,SAAQ,oBAA2C,YAAW,SAAS,EAAE,OAAO;IA4BzG,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,YAAY;IAtCtB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,qBAAqB,CAAS;IAEtC,wFAAwF;IACxF,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAE1C,sDAAsD;IACtD,OAAO,CAAC,sBAAsB,CAAC,CAAqB;IAEpD,OAAO,CAAC,+BAA+B,CAA0B;IACjE,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,oGAAoG;IACpG,OAAO,CAAC,2BAA2B,CAAuC;IAE1E,OAAO,CAAC,wBAAwB,CAA8D;IAC9F,OAAO,CAAC,oCAAoC,CAAuE;IACnH,OAAO,CAAC,4BAA4B,CAAuE;IAC3G,OAAO,CAAC,yBAAyB,CAA2D;IAE5F,mFAAmF;IACnF,OAAO,CAAC,oBAAoB,CAAC,CAAyB;IAEtD,SAAS,aACC,QAAQ,EAAE,yBAAyB,EACnC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,GAAG,EACd,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,aAAa,EAC1B,kBAAkB,EAAE,0BAA0B,EAC9C,UAAU,EAAE,sBAAsB,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,MAAM,EAAE,yBAAyB,EACjC,UAAU,EAAE,mBAAmB,EAC/B,wBAAwB,EAAE,iBAAiB,EAC3C,YAAY,GAAE,YAAiC,EACvD,SAAS,GAAE,eAAsC,EACjD,GAAG,SAA4B,EAuBhC;IAED,OAAc,6BAA6B,CAAC,eAAe,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM,QAuB5F;YAEa,0BAA0B;IA4BxC,OAAa,GAAG,CACd,MAAM,EAAE,yBAAyB,EACjC,kBAAkB,EAAE,0BAA0B,EAC9C,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,GAAG,EACd,WAAW,EAAE,aAAa,GAAG,WAAW,EACxC,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,WAAW,EACvB,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,mBAAmB,EAC/B,kBAAkB,EAAE,4BAA4B,EAChD,YAAY,GAAE,YAAiC,EAC/C,SAAS,GAAE,eAAsC,EACjD,oBAAoB,CAAC,EAAE,0BAA0B,4BAsElD;IAEM,qBAAqB,iBAI3B;IAEM,kBAAkB,oBAExB;IAEM,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,cAAc,sBAEzF;IAED,OAAO,CAAC,mBAAmB;IAOpB,sBAAsB,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAE9D;IAEM,0BAA0B,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,CAEpE;IAEM,SAAS,IAAI,yBAAyB,CAE5C;IAEM,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE9D;IAEM,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE1D;IAEM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,QAG7D;IAEM,cAAc,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAQvD;IAEY,KAAK,kBAmBjB;IAEY,IAAI,kBAGhB;IAED,0CAA0C;IAC7B,gBAAgB,kBA2C5B;IAED;;;;OAIG;IACG,qBAAqB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwFtG;IAED;;;;;OAKG;IACG,0BAA0B,CAC9B,QAAQ,EAAE,+BAA+B,EACzC,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,EAAE,GAAG,SAAS,CAAC,CA6G9C;IAED;;;OAGG;IACH,OAAO,CAAC,kBAAkB;YAiBZ,wCAAwC;IAmBtD;;OAEG;IACH,UAAgB,wBAAwB,CAAC,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB/G;IAED,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,+BAA+B;IAqBvC,OAAO,CAAC,8BAA8B;IA2BtC,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,2BAA2B;IAqBnC,OAAO,CAAC,wCAAwC;IAuBhD;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAwB/B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAoB5B,mBAAmB,CACvB,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,EAAE,EACX,GAAG,EAAE,EAAE,EAAE,EACT,eAAe,EAAE,UAAU,GAAG,SAAS,EACvC,OAAO,GAAE,oBAAyB,EAClC,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,aAAa,CAAC,CAkCxB;IAEK,wBAAwB,CAC5B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,EAAE,EACX,gBAAgB,EAAE,gBAAgB,EAClC,qBAAqB,EAAE,MAAM,EAC7B,iBAAiB,EAAE,aAAa,GAAG,SAAS,EAC5C,eAAe,EAAE,UAAU,GAAG,SAAS,EACvC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,kBAAkB,CAAC,CAiC7B;IAEK,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;IAEK,0BAA0B,CAC9B,sBAAsB,EAAE,+BAA+B,EACvD,QAAQ,EAAE,UAAU,EACpB,IAAI,EAAE,UAAU,EAChB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,SAAS,CAAC,CAOpB;IAEK,sBAAsB,CAC1B,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAiBlC;IAEK,mBAAmB,CACvB,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,IAAI,EACd,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAuDlC;YAEa,iBAAiB;CAwBhC"}