@aztec/epoch-cache 0.0.1-commit.b655e406 → 0.0.1-commit.b6e433891

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.
package/dest/config.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { type L1ContractsConfig, type L1ReaderConfig } from '@aztec/ethereum';
2
- export type EpochCacheConfig = Pick<L1ReaderConfig & L1ContractsConfig, 'l1RpcUrls' | 'l1ChainId' | 'viemPollingIntervalMS' | 'ethereumSlotDuration'>;
1
+ import { type L1ContractsConfig } from '@aztec/ethereum/config';
2
+ import { type L1ReaderConfig } from '@aztec/ethereum/l1-reader';
3
+ import { type PipelineConfig } from '@aztec/stdlib/config';
4
+ export type EpochCacheConfig = Pick<L1ReaderConfig & L1ContractsConfig & PipelineConfig, 'l1RpcUrls' | 'l1ChainId' | 'viemPollingIntervalMS' | 'ethereumSlotDuration' | 'l1HttpTimeoutMS' | 'enableProposerPipelining'>;
3
5
  export declare function getEpochCacheConfigEnvVars(): EpochCacheConfig;
4
- //# sourceMappingURL=config.d.ts.map
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLGlCQUFpQixFQUErQixNQUFNLHdCQUF3QixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLGNBQWMsRUFBNEIsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQTRCLE1BQU0sc0JBQXNCLENBQUM7QUFFckYsTUFBTSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FDakMsY0FBYyxHQUFHLGlCQUFpQixHQUFHLGNBQWMsRUFDakQsV0FBVyxHQUNYLFdBQVcsR0FDWCx1QkFBdUIsR0FDdkIsc0JBQXNCLEdBQ3RCLGlCQUFpQixHQUNqQiwwQkFBMEIsQ0FDN0IsQ0FBQztBQUVGLHdCQUFnQiwwQkFBMEIsSUFBSSxnQkFBZ0IsQ0FFN0QifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAGpB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,cAAc,GAAG,iBAAiB,EAClC,WAAW,GAAG,WAAW,GAAG,uBAAuB,GAAG,sBAAsB,CAC7E,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,KAAK,cAAc,EAA4B,MAAM,sBAAsB,CAAC;AAErF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,cAAc,GAAG,iBAAiB,GAAG,cAAc,EACjD,WAAW,GACX,WAAW,GACX,uBAAuB,GACvB,sBAAsB,GACtB,iBAAiB,GACjB,0BAA0B,CAC7B,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
package/dest/config.js CHANGED
@@ -1,7 +1,10 @@
1
- import { getL1ContractsConfigEnvVars, getL1ReaderConfigFromEnv } from '@aztec/ethereum';
1
+ import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
2
+ import { getL1ReaderConfigFromEnv } from '@aztec/ethereum/l1-reader';
3
+ import { getPipelineConfigEnvVars } from '@aztec/stdlib/config';
2
4
  export function getEpochCacheConfigEnvVars() {
3
5
  return {
4
6
  ...getL1ReaderConfigFromEnv(),
5
- ...getL1ContractsConfigEnvVars()
7
+ ...getL1ContractsConfigEnvVars(),
8
+ ...getPipelineConfigEnvVars()
6
9
  };
7
10
  }
@@ -1,36 +1,59 @@
1
- import { RollupContract } from '@aztec/ethereum';
1
+ import { RollupContract } from '@aztec/ethereum/contracts';
2
+ import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
3
  import { EthAddress } from '@aztec/foundation/eth-address';
3
4
  import { DateProvider } from '@aztec/foundation/timer';
4
5
  import { type L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
5
6
  import { type EpochCacheConfig } from './config.js';
7
+ /** When proposer pipelining is enabled, the proposer builds one slot ahead. */
8
+ export declare const PROPOSER_PIPELINING_SLOT_OFFSET = 1;
9
+ /** Flat return type for compound epoch/slot getters. */
6
10
  export type EpochAndSlot = {
7
- epoch: bigint;
8
- slot: bigint;
11
+ slot: SlotNumber;
12
+ epoch: EpochNumber;
9
13
  ts: bigint;
10
14
  };
11
15
  export type EpochCommitteeInfo = {
12
16
  committee: EthAddress[] | undefined;
13
17
  seed: bigint;
14
- epoch: bigint;
18
+ epoch: EpochNumber;
19
+ /** True if the epoch is within an open escape hatch window. */
20
+ isEscapeHatchOpen: boolean;
15
21
  };
16
- export type SlotTag = 'now' | 'next' | bigint;
22
+ export type SlotTag = 'now' | 'next' | SlotNumber;
17
23
  export interface EpochCacheInterface {
18
24
  getCommittee(slot: SlotTag | undefined): Promise<EpochCommitteeInfo>;
19
- getEpochAndSlotNow(): EpochAndSlot;
25
+ getSlotNow(): SlotNumber;
26
+ getTargetSlot(): SlotNumber;
27
+ getEpochNow(): EpochNumber;
28
+ getTargetEpoch(): EpochNumber;
29
+ getEpochAndSlotNow(): EpochAndSlot & {
30
+ nowMs: bigint;
31
+ };
20
32
  getEpochAndSlotInNextL1Slot(): EpochAndSlot & {
21
- now: bigint;
33
+ nowSeconds: bigint;
34
+ };
35
+ /** Returns epoch/slot info for the next L1 slot with pipeline offset applied. */
36
+ getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & {
37
+ nowSeconds: bigint;
22
38
  };
23
- getProposerIndexEncoding(epoch: bigint, slot: bigint, seed: bigint): `0x${string}`;
24
- computeProposerIndex(slot: bigint, epoch: bigint, seed: bigint, size: bigint): bigint;
25
- getProposerAttesterAddressInCurrentOrNextSlot(): Promise<{
26
- currentProposer: EthAddress | undefined;
27
- nextProposer: EthAddress | undefined;
28
- currentSlot: bigint;
29
- nextSlot: bigint;
30
- }>;
39
+ isProposerPipeliningEnabled(): boolean;
40
+ isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
41
+ isEscapeHatchOpenAtSlot(slot: SlotTag): Promise<boolean>;
42
+ getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
43
+ computeProposerIndex(slot: SlotNumber, epoch: EpochNumber, seed: bigint, size: bigint): bigint;
44
+ getCurrentAndNextSlot(): {
45
+ currentSlot: SlotNumber;
46
+ nextSlot: SlotNumber;
47
+ };
48
+ getTargetAndNextSlot(): {
49
+ targetSlot: SlotNumber;
50
+ nextSlot: SlotNumber;
51
+ };
52
+ getProposerAttesterAddressInSlot(slot: SlotNumber): Promise<EthAddress | undefined>;
31
53
  getRegisteredValidators(): Promise<EthAddress[]>;
32
54
  isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
33
55
  filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
56
+ getL1Constants(): L1RollupConstants;
34
57
  }
35
58
  /**
36
59
  * Epoch cache
@@ -48,29 +71,57 @@ export declare class EpochCache implements EpochCacheInterface {
48
71
  protected readonly config: {
49
72
  cacheSize: number;
50
73
  validatorRefreshIntervalSeconds: number;
74
+ enableProposerPipelining: boolean;
51
75
  };
52
- protected cache: Map<bigint, EpochCommitteeInfo>;
76
+ protected cache: Map<EpochNumber, EpochCommitteeInfo>;
53
77
  private allValidators;
54
78
  private lastValidatorRefresh;
55
79
  private readonly log;
56
- constructor(rollup: RollupContract, l1constants?: L1RollupConstants, dateProvider?: DateProvider, config?: {
80
+ protected enableProposerPipelining: boolean;
81
+ constructor(rollup: RollupContract, l1constants: L1RollupConstants & {
82
+ lagInEpochsForValidatorSet: number;
83
+ lagInEpochsForRandao: number;
84
+ }, dateProvider?: DateProvider, config?: {
57
85
  cacheSize: number;
58
86
  validatorRefreshIntervalSeconds: number;
87
+ enableProposerPipelining: boolean;
59
88
  });
60
89
  static create(rollupOrAddress: EthAddress | RollupContract, config?: EpochCacheConfig, deps?: {
61
90
  dateProvider?: DateProvider;
62
91
  }): Promise<EpochCache>;
63
92
  getL1Constants(): L1RollupConstants;
93
+ isProposerPipeliningEnabled(): boolean;
94
+ getSlotNow(): SlotNumber;
95
+ getTargetSlot(): SlotNumber;
96
+ getEpochNow(): EpochNumber;
97
+ getTargetEpoch(): EpochNumber;
64
98
  getEpochAndSlotNow(): EpochAndSlot & {
65
- now: bigint;
99
+ nowMs: bigint;
66
100
  };
67
101
  nowInSeconds(): bigint;
68
102
  private getEpochAndSlotAtSlot;
69
103
  getEpochAndSlotInNextL1Slot(): EpochAndSlot & {
70
- now: bigint;
104
+ nowSeconds: bigint;
105
+ };
106
+ getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & {
107
+ nowSeconds: bigint;
71
108
  };
72
109
  private getEpochAndSlotAtTimestamp;
73
- getCommitteeForEpoch(epoch: bigint): Promise<EpochCommitteeInfo>;
110
+ getCommitteeForEpoch(epoch: EpochNumber): Promise<EpochCommitteeInfo>;
111
+ /**
112
+ * Returns whether the escape hatch is open for the given epoch.
113
+ *
114
+ * Uses the already-cached EpochCommitteeInfo when available. If not cached, it will fetch
115
+ * the epoch committee info (which includes the escape hatch flag) and return it.
116
+ */
117
+ isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean>;
118
+ /**
119
+ * Returns whether the escape hatch is open for the epoch containing the given slot.
120
+ *
121
+ * This is a lightweight helper intended for callers that already have a slot number and only
122
+ * need the escape hatch flag (without pulling full committee info).
123
+ */
124
+ isEscapeHatchOpenAtSlot(slot?: SlotTag): Promise<boolean>;
74
125
  /**
75
126
  * Get the current validator set
76
127
  * @param nextSlot - If true, get the validator set for the next slot.
@@ -82,44 +133,36 @@ export declare class EpochCache implements EpochCacheInterface {
82
133
  /**
83
134
  * Get the ABI encoding of the proposer index - see ValidatorSelectionLib.sol computeProposerIndex
84
135
  */
85
- getProposerIndexEncoding(epoch: bigint, slot: bigint, seed: bigint): `0x${string}`;
86
- computeProposerIndex(slot: bigint, epoch: bigint, seed: bigint, size: bigint): bigint;
87
- /**
88
- * Returns the current and next proposer's attester address
89
- *
90
- * We return the next proposer's attester address as the node will check if it is the proposer at the next ethereum block,
91
- * which can be the next slot. If this is the case, then it will send proposals early.
92
- */
93
- getProposerAttesterAddressInCurrentOrNextSlot(): Promise<{
94
- currentSlot: bigint;
95
- nextSlot: bigint;
96
- currentProposer: EthAddress | undefined;
97
- nextProposer: EthAddress | undefined;
98
- }>;
136
+ getProposerIndexEncoding(epoch: EpochNumber, slot: SlotNumber, seed: bigint): `0x${string}`;
137
+ computeProposerIndex(slot: SlotNumber, epoch: EpochNumber, seed: bigint, size: bigint): bigint;
138
+ /** Returns the current and next L2 slot in next eth L1 Slot. */
139
+ getCurrentAndNextSlot(): {
140
+ currentSlot: SlotNumber;
141
+ nextSlot: SlotNumber;
142
+ };
143
+ /** Returns the taget and next L2 slot in the next L1 slot */
144
+ getTargetAndNextSlot(): {
145
+ targetSlot: SlotNumber;
146
+ nextSlot: SlotNumber;
147
+ };
99
148
  /**
100
149
  * Get the proposer attester address in the given L2 slot
101
150
  * @returns The proposer attester address. If the committee does not exist, we throw a NoCommitteeError.
102
151
  * If the committee is empty (i.e. target committee size is 0, and anyone can propose), we return undefined.
103
152
  */
104
- getProposerAttesterAddressInSlot(slot: bigint): Promise<EthAddress | undefined>;
153
+ getProposerAttesterAddressInSlot(slot: SlotNumber): Promise<EthAddress | undefined>;
105
154
  /**
106
155
  * Get the proposer attester address in the next slot
107
156
  * @returns The proposer attester address. If the committee does not exist, we throw a NoCommitteeError.
108
157
  * If the committee is empty (i.e. target committee size is 0, and anyone can propose), we return undefined.
109
158
  */
110
159
  getProposerAttesterAddressInNextSlot(): Promise<EthAddress | undefined>;
111
- /**
112
- * Get the proposer attester address at a given epoch and slot
113
- * @param when - The epoch and slot to get the proposer attester address at
114
- * @returns The proposer attester address. If the committee does not exist, we throw a NoCommitteeError.
115
- * If the committee is empty (i.e. target committee size is 0, and anyone can propose), we return undefined.
116
- */
117
160
  private getProposerAttesterAddressAt;
118
- getProposerFromEpochCommittee(epochCommitteeInfo: EpochCommitteeInfo, slot: bigint): EthAddress | undefined;
161
+ getProposerFromEpochCommittee(epochCommitteeInfo: EpochCommitteeInfo, slot: SlotNumber): EthAddress | undefined;
119
162
  /** Check if a validator is in the given slot's committee */
120
163
  isInCommittee(slot: SlotTag, validator: EthAddress): Promise<boolean>;
121
164
  /** From the set of given addresses, return all that are on the committee for the given slot */
122
165
  filterInCommittee(slot: SlotTag, validators: EthAddress[]): Promise<EthAddress[]>;
123
166
  getRegisteredValidators(): Promise<EthAddress[]>;
124
167
  }
125
- //# sourceMappingURL=epoch_cache.d.ts.map
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2hfY2FjaGUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lcG9jaF9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQW9CLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsS0FBSyxpQkFBaUIsRUFNdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUlyQyxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBOEIsTUFBTSxhQUFhLENBQUM7QUFFaEYsK0VBQStFO0FBQy9FLGVBQU8sTUFBTSwrQkFBK0IsSUFBSSxDQUFDO0FBRWpELHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sWUFBWSxHQUFHO0lBQ3pCLElBQUksRUFBRSxVQUFVLENBQUM7SUFDakIsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNuQixFQUFFLEVBQUUsTUFBTSxDQUFDO0NBQ1osQ0FBQztBQUVGLE1BQU0sTUFBTSxrQkFBa0IsR0FBRztJQUMvQixTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLElBQUksRUFBRSxNQUFNLENBQUM7SUFDYixLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ25CLCtEQUErRDtJQUMvRCxpQkFBaUIsRUFBRSxPQUFPLENBQUM7Q0FDNUIsQ0FBQztBQUVGLE1BQU0sTUFBTSxPQUFPLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7QUFFbEQsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckUsVUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"epoch_cache.d.ts","sourceRoot":"","sources":["../src/epoch_cache.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
- import { NoCommitteeError, RollupContract, createEthereumChain } from '@aztec/ethereum';
1
+ import { createEthereumChain } from '@aztec/ethereum/chain';
2
+ import { makeL1HttpTransport } from '@aztec/ethereum/client';
3
+ import { NoCommitteeError, RollupContract } from '@aztec/ethereum/contracts';
4
+ import { SlotNumber } from '@aztec/foundation/branded-types';
2
5
  import { EthAddress } from '@aztec/foundation/eth-address';
3
6
  import { createLogger } from '@aztec/foundation/log';
4
7
  import { DateProvider } from '@aztec/foundation/timer';
5
- import { EmptyL1RollupConstants, getEpochAtSlot, getEpochNumberAtTimestamp, getSlotAtTimestamp, getSlotRangeForEpoch, getTimestampForSlot, getTimestampRangeForEpoch } from '@aztec/stdlib/epoch-helpers';
6
- import { createPublicClient, encodeAbiParameters, fallback, http, keccak256 } from 'viem';
8
+ import { getEpochAtSlot, getEpochNumberAtTimestamp, getSlotAtTimestamp, getSlotRangeForEpoch, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
9
+ import { createPublicClient, encodeAbiParameters, keccak256 } from 'viem';
7
10
  import { getEpochCacheConfigEnvVars } from './config.js';
11
+ /** When proposer pipelining is enabled, the proposer builds one slot ahead. */ export const PROPOSER_PIPELINING_SLOT_OFFSET = 1;
8
12
  /**
9
13
  * Epoch cache
10
14
  *
@@ -18,13 +22,16 @@ import { getEpochCacheConfigEnvVars } from './config.js';
18
22
  l1constants;
19
23
  dateProvider;
20
24
  config;
25
+ // eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
21
26
  cache;
22
27
  allValidators;
23
28
  lastValidatorRefresh;
24
29
  log;
25
- constructor(rollup, l1constants = EmptyL1RollupConstants, dateProvider = new DateProvider(), config = {
30
+ enableProposerPipelining;
31
+ constructor(rollup, l1constants, dateProvider = new DateProvider(), config = {
26
32
  cacheSize: 12,
27
- validatorRefreshIntervalSeconds: 60
33
+ validatorRefreshIntervalSeconds: 60,
34
+ enableProposerPipelining: false
28
35
  }){
29
36
  this.rollup = rollup;
30
37
  this.l1constants = l1constants;
@@ -34,8 +41,10 @@ import { getEpochCacheConfigEnvVars } from './config.js';
34
41
  this.allValidators = new Set();
35
42
  this.lastValidatorRefresh = 0;
36
43
  this.log = createLogger('epoch-cache');
44
+ this.enableProposerPipelining = this.config.enableProposerPipelining;
37
45
  this.log.debug(`Initialized EpochCache`, {
38
- l1constants
46
+ l1constants,
47
+ enableProposerPipelining: this.enableProposerPipelining
39
48
  });
40
49
  }
41
50
  static async create(rollupOrAddress, config, deps = {}) {
@@ -48,17 +57,23 @@ import { getEpochCacheConfigEnvVars } from './config.js';
48
57
  const chain = createEthereumChain(config.l1RpcUrls, config.l1ChainId);
49
58
  const publicClient = createPublicClient({
50
59
  chain: chain.chainInfo,
51
- transport: fallback(config.l1RpcUrls.map((url)=>http(url))),
60
+ transport: makeL1HttpTransport(config.l1RpcUrls, {
61
+ timeout: config.l1HttpTimeoutMS
62
+ }),
52
63
  pollingInterval: config.viemPollingIntervalMS
53
64
  });
54
65
  rollup = new RollupContract(publicClient, rollupOrAddress.toString());
55
66
  }
56
- const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, slotDuration, epochDuration] = await Promise.all([
67
+ const [l1StartBlock, l1GenesisTime, proofSubmissionEpochs, slotDuration, epochDuration, lagInEpochsForValidatorSet, lagInEpochsForRandao, targetCommitteeSize, rollupManaLimit] = await Promise.all([
57
68
  rollup.getL1StartBlock(),
58
69
  rollup.getL1GenesisTime(),
59
70
  rollup.getProofSubmissionEpochs(),
60
71
  rollup.getSlotDuration(),
61
- rollup.getEpochDuration()
72
+ rollup.getEpochDuration(),
73
+ rollup.getLagInEpochsForValidatorSet(),
74
+ rollup.getLagInEpochsForRandao(),
75
+ rollup.getTargetCommitteeSize(),
76
+ rollup.getManaLimit()
62
77
  ]);
63
78
  const l1RollupConstants = {
64
79
  l1StartBlock,
@@ -66,46 +81,80 @@ import { getEpochCacheConfigEnvVars } from './config.js';
66
81
  proofSubmissionEpochs: Number(proofSubmissionEpochs),
67
82
  slotDuration: Number(slotDuration),
68
83
  epochDuration: Number(epochDuration),
69
- ethereumSlotDuration: config.ethereumSlotDuration
84
+ ethereumSlotDuration: config.ethereumSlotDuration,
85
+ lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
86
+ lagInEpochsForRandao: Number(lagInEpochsForRandao),
87
+ targetCommitteeSize: Number(targetCommitteeSize),
88
+ rollupManaLimit: Number(rollupManaLimit)
70
89
  };
71
- return new EpochCache(rollup, l1RollupConstants, deps.dateProvider);
90
+ return new EpochCache(rollup, l1RollupConstants, deps.dateProvider, {
91
+ cacheSize: 12,
92
+ validatorRefreshIntervalSeconds: 60,
93
+ enableProposerPipelining: config.enableProposerPipelining
94
+ });
72
95
  }
73
96
  getL1Constants() {
74
97
  return this.l1constants;
75
98
  }
99
+ isProposerPipeliningEnabled() {
100
+ return this.enableProposerPipelining;
101
+ }
102
+ getSlotNow() {
103
+ return this.getEpochAndSlotNow().slot;
104
+ }
105
+ getTargetSlot() {
106
+ const slotNow = this.getSlotNow();
107
+ const offset = this.isProposerPipeliningEnabled() ? PROPOSER_PIPELINING_SLOT_OFFSET : 0;
108
+ return SlotNumber(slotNow + offset);
109
+ }
110
+ getEpochNow() {
111
+ return this.getEpochAndSlotNow().epoch;
112
+ }
113
+ getTargetEpoch() {
114
+ return getEpochAtSlot(this.getTargetSlot(), this.l1constants);
115
+ }
76
116
  getEpochAndSlotNow() {
77
- const now = this.nowInSeconds();
117
+ const nowMs = BigInt(this.dateProvider.now());
118
+ const nowSeconds = nowMs / 1000n;
78
119
  return {
79
- ...this.getEpochAndSlotAtTimestamp(now),
80
- now
120
+ ...this.getEpochAndSlotAtTimestamp(nowSeconds),
121
+ nowMs
81
122
  };
82
123
  }
83
124
  nowInSeconds() {
84
125
  return BigInt(Math.floor(this.dateProvider.now() / 1000));
85
126
  }
86
127
  getEpochAndSlotAtSlot(slot) {
87
- const epoch = getEpochAtSlot(slot, this.l1constants);
88
- const ts = getTimestampRangeForEpoch(epoch, this.l1constants)[0];
89
- return {
90
- epoch,
91
- ts,
92
- slot
93
- };
128
+ return this.getEpochAndSlotAtTimestamp(getTimestampForSlot(slot, this.l1constants));
94
129
  }
95
130
  getEpochAndSlotInNextL1Slot() {
96
- const now = this.nowInSeconds();
97
- const nextSlotTs = now + BigInt(this.l1constants.ethereumSlotDuration);
131
+ const nowSeconds = this.nowInSeconds();
132
+ const nextSlotTs = nowSeconds + BigInt(this.l1constants.ethereumSlotDuration);
98
133
  return {
99
134
  ...this.getEpochAndSlotAtTimestamp(nextSlotTs),
100
- now
135
+ nowSeconds
136
+ };
137
+ }
138
+ getTargetEpochAndSlotInNextL1Slot() {
139
+ if (!this.isProposerPipeliningEnabled()) {
140
+ return this.getEpochAndSlotInNextL1Slot();
141
+ }
142
+ const result = this.getEpochAndSlotInNextL1Slot();
143
+ const offset = PROPOSER_PIPELINING_SLOT_OFFSET;
144
+ const targetSlot = SlotNumber(result.slot + offset);
145
+ return {
146
+ ...result,
147
+ slot: targetSlot,
148
+ epoch: getEpochAtSlot(targetSlot, this.l1constants)
101
149
  };
102
150
  }
103
151
  getEpochAndSlotAtTimestamp(ts) {
104
152
  const slot = getSlotAtTimestamp(ts, this.l1constants);
153
+ const epoch = getEpochNumberAtTimestamp(ts, this.l1constants);
105
154
  return {
106
- epoch: getEpochNumberAtTimestamp(ts, this.l1constants),
107
- ts: getTimestampForSlot(slot, this.l1constants),
108
- slot
155
+ slot,
156
+ epoch,
157
+ ts: getTimestampForSlot(slot, this.l1constants)
109
158
  };
110
159
  }
111
160
  getCommitteeForEpoch(epoch) {
@@ -113,6 +162,28 @@ import { getEpochCacheConfigEnvVars } from './config.js';
113
162
  return this.getCommittee(startSlot);
114
163
  }
115
164
  /**
165
+ * Returns whether the escape hatch is open for the given epoch.
166
+ *
167
+ * Uses the already-cached EpochCommitteeInfo when available. If not cached, it will fetch
168
+ * the epoch committee info (which includes the escape hatch flag) and return it.
169
+ */ async isEscapeHatchOpen(epoch) {
170
+ const cached = this.cache.get(epoch);
171
+ if (cached) {
172
+ return cached.isEscapeHatchOpen;
173
+ }
174
+ const info = await this.getCommitteeForEpoch(epoch);
175
+ return info.isEscapeHatchOpen;
176
+ }
177
+ /**
178
+ * Returns whether the escape hatch is open for the epoch containing the given slot.
179
+ *
180
+ * This is a lightweight helper intended for callers that already have a slot number and only
181
+ * need the escape hatch flag (without pulling full committee info).
182
+ */ async isEscapeHatchOpenAtSlot(slot = 'now') {
183
+ const epoch = slot === 'now' ? this.getEpochNow() : slot === 'next' ? this.getEpochAndSlotInNextL1Slot().epoch : getEpochAtSlot(slot, this.l1constants);
184
+ return await this.isEscapeHatchOpen(epoch);
185
+ }
186
+ /**
116
187
  * Get the current validator set
117
188
  * @param nextSlot - If true, get the validator set for the next slot.
118
189
  * @returns The current validator set.
@@ -145,15 +216,24 @@ import { getEpochCacheConfigEnvVars } from './config.js';
145
216
  }
146
217
  async computeCommittee(when) {
147
218
  const { ts, epoch } = when;
148
- const [committeeHex, seed] = await Promise.all([
219
+ const [committee, seedBuffer, l1Timestamp, isEscapeHatchOpen] = await Promise.all([
149
220
  this.rollup.getCommitteeAt(ts),
150
- this.rollup.getSampleSeedAt(ts)
221
+ this.rollup.getSampleSeedAt(ts),
222
+ this.rollup.client.getBlock({
223
+ includeTransactions: false
224
+ }).then((b)=>b.timestamp),
225
+ this.rollup.isEscapeHatchOpen(epoch)
151
226
  ]);
152
- const committee = committeeHex?.map((v)=>EthAddress.fromString(v));
227
+ const { lagInEpochsForValidatorSet, epochDuration, slotDuration } = this.l1constants;
228
+ const sub = BigInt(lagInEpochsForValidatorSet) * BigInt(epochDuration) * BigInt(slotDuration);
229
+ if (ts - sub > l1Timestamp) {
230
+ throw new Error(`Cannot query committee for future epoch ${epoch} with timestamp ${ts} (current L1 time is ${l1Timestamp}). Check your Ethereum node is synced.`);
231
+ }
153
232
  return {
154
233
  committee,
155
- seed,
156
- epoch
234
+ seed: seedBuffer.toBigInt(),
235
+ epoch,
236
+ isEscapeHatchOpen
157
237
  };
158
238
  }
159
239
  /**
@@ -173,8 +253,8 @@ import { getEpochCacheConfigEnvVars } from './config.js';
173
253
  name: 'seed'
174
254
  }
175
255
  ], [
176
- epoch,
177
- slot,
256
+ BigInt(epoch),
257
+ BigInt(slot),
178
258
  seed
179
259
  ]);
180
260
  }
@@ -185,18 +265,19 @@ import { getEpochCacheConfigEnvVars } from './config.js';
185
265
  }
186
266
  return BigInt(keccak256(this.getProposerIndexEncoding(epoch, slot, seed))) % size;
187
267
  }
188
- /**
189
- * Returns the current and next proposer's attester address
190
- *
191
- * We return the next proposer's attester address as the node will check if it is the proposer at the next ethereum block,
192
- * which can be the next slot. If this is the case, then it will send proposals early.
193
- */ async getProposerAttesterAddressInCurrentOrNextSlot() {
194
- const current = this.getEpochAndSlotNow();
268
+ /** Returns the current and next L2 slot in next eth L1 Slot. */ getCurrentAndNextSlot() {
269
+ const currentSlot = this.getSlotNow();
195
270
  const next = this.getEpochAndSlotInNextL1Slot();
196
271
  return {
197
- currentProposer: await this.getProposerAttesterAddressAt(current),
198
- nextProposer: await this.getProposerAttesterAddressAt(next),
199
- currentSlot: current.slot,
272
+ currentSlot,
273
+ nextSlot: next.slot
274
+ };
275
+ }
276
+ /** Returns the taget and next L2 slot in the next L1 slot */ getTargetAndNextSlot() {
277
+ const targetSlot = this.getTargetSlot();
278
+ const next = this.getTargetEpochAndSlotInNextL1Slot();
279
+ return {
280
+ targetSlot,
200
281
  nextSlot: next.slot
201
282
  };
202
283
  }
@@ -259,9 +340,9 @@ import { getEpochCacheConfigEnvVars } from './config.js';
259
340
  const validatorRefreshTime = this.lastValidatorRefresh + validatorRefreshIntervalMs;
260
341
  if (validatorRefreshTime < this.dateProvider.now()) {
261
342
  const currentSet = await this.rollup.getAttesters();
262
- this.allValidators = new Set(currentSet);
343
+ this.allValidators = new Set(currentSet.map((v)=>v.toString()));
263
344
  this.lastValidatorRefresh = this.dateProvider.now();
264
345
  }
265
- return Array.from(this.allValidators.keys().map((v)=>EthAddress.fromString(v)));
346
+ return Array.from(this.allValidators.keys()).map((v)=>EthAddress.fromString(v));
266
347
  }
267
348
  }
package/dest/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export * from './epoch_cache.js';
2
2
  export * from './config.js';
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsYUFBYSxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ export * from './test_epoch_cache.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUMifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './test_epoch_cache.js';