@aztec/ethereum 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108
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/account.d.ts +1 -1
- package/dest/chain.d.ts +1 -1
- package/dest/client.d.ts +2 -2
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +6 -2
- package/dest/config.d.ts +18 -46
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +40 -285
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts +8 -6
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_base.js +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +8 -6
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +18 -3
- package/dest/contracts/errors.d.ts +1 -1
- package/dest/contracts/errors.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.d.ts +4 -4
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/fee_juice.d.ts +1 -1
- package/dest/contracts/fee_juice.d.ts.map +1 -1
- package/dest/contracts/governance.d.ts +16 -16
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +7 -3
- package/dest/contracts/governance_proposer.d.ts +7 -6
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +400 -12
- package/dest/contracts/gse.d.ts +1 -1
- package/dest/contracts/gse.d.ts.map +1 -1
- package/dest/contracts/inbox.d.ts +7 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +4 -0
- package/dest/contracts/index.d.ts +1 -1
- package/dest/contracts/multicall.d.ts +5 -7
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +6 -4
- package/dest/contracts/registry.d.ts +1 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/rollup.d.ts +169 -118
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +714 -243
- package/dest/contracts/slasher_contract.d.ts +11 -1
- package/dest/contracts/slasher_contract.d.ts.map +1 -1
- package/dest/contracts/slasher_contract.js +18 -0
- package/dest/contracts/tally_slashing_proposer.d.ts +15 -7
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +15 -5
- package/dest/contracts/utils.d.ts +1 -1
- package/dest/deploy_aztec_l1_contracts.d.ts +247 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +336 -0
- package/dest/deploy_l1_contract.d.ts +68 -0
- package/dest/deploy_l1_contract.d.ts.map +1 -0
- package/dest/deploy_l1_contract.js +312 -0
- package/dest/eth-signer/eth-signer.d.ts +1 -1
- package/dest/eth-signer/index.d.ts +1 -1
- package/dest/forwarder_proxy.d.ts +32 -0
- package/dest/forwarder_proxy.d.ts.map +1 -0
- package/dest/forwarder_proxy.js +93 -0
- package/dest/l1_artifacts.d.ts +17733 -6280
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +10 -5
- package/dest/l1_contract_addresses.d.ts +8 -4
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +5 -4
- package/dest/l1_reader.d.ts +4 -2
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +7 -1
- package/dest/l1_tx_utils/config.d.ts +59 -0
- package/dest/l1_tx_utils/config.d.ts.map +1 -0
- package/dest/l1_tx_utils/config.js +96 -0
- package/dest/l1_tx_utils/constants.d.ts +12 -0
- package/dest/l1_tx_utils/constants.d.ts.map +1 -0
- package/dest/l1_tx_utils/constants.js +39 -0
- package/dest/l1_tx_utils/factory.d.ts +24 -0
- package/dest/l1_tx_utils/factory.d.ts.map +1 -0
- package/dest/l1_tx_utils/factory.js +12 -0
- package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
- package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
- package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +48 -0
- package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
- package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/index-blobs.js +2 -0
- package/dest/l1_tx_utils/index.d.ts +12 -0
- package/dest/l1_tx_utils/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/index.js +12 -0
- package/dest/l1_tx_utils/interfaces.d.ts +76 -0
- package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
- package/dest/l1_tx_utils/interfaces.js +4 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +94 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.js +623 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +83 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +323 -0
- package/dest/l1_tx_utils/signer.d.ts +4 -0
- package/dest/l1_tx_utils/signer.d.ts.map +1 -0
- package/dest/l1_tx_utils/signer.js +16 -0
- package/dest/l1_tx_utils/types.d.ts +67 -0
- package/dest/l1_tx_utils/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/types.js +26 -0
- package/dest/l1_tx_utils/utils.d.ts +4 -0
- package/dest/l1_tx_utils/utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/utils.js +14 -0
- package/dest/l1_types.d.ts +1 -1
- package/dest/publisher_manager.d.ts +8 -3
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +36 -8
- package/dest/queries.d.ts +1 -1
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +20 -14
- package/dest/test/chain_monitor.d.ts +29 -22
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +81 -38
- package/dest/test/delayed_tx_utils.d.ts +3 -3
- package/dest/test/delayed_tx_utils.d.ts.map +1 -1
- package/dest/test/delayed_tx_utils.js +2 -2
- package/dest/test/eth_cheat_codes.d.ts +36 -14
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +126 -31
- package/dest/test/eth_cheat_codes_with_state.d.ts +1 -1
- package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
- package/dest/test/index.d.ts +1 -1
- package/dest/test/rollup_cheat_codes.d.ts +23 -20
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +82 -43
- package/dest/test/start_anvil.d.ts +4 -1
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +2 -1
- package/dest/test/tx_delayer.d.ts +1 -1
- package/dest/test/tx_delayer.d.ts.map +1 -1
- package/dest/test/tx_delayer.js +4 -3
- package/dest/test/upgrade_utils.d.ts +1 -1
- package/dest/test/upgrade_utils.d.ts.map +1 -1
- package/dest/test/upgrade_utils.js +3 -2
- package/dest/types.d.ts +57 -2
- package/dest/types.d.ts.map +1 -1
- package/dest/utils.d.ts +15 -3
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +28 -161
- package/dest/zkPassportVerifierAddress.d.ts +1 -1
- package/dest/zkPassportVerifierAddress.js +1 -1
- package/package.json +33 -14
- package/src/client.ts +3 -3
- package/src/config.ts +49 -358
- package/src/contracts/empire_base.ts +7 -6
- package/src/contracts/empire_slashing_proposer.ts +23 -8
- package/src/contracts/fee_asset_handler.ts +1 -1
- package/src/contracts/governance.ts +3 -3
- package/src/contracts/governance_proposer.ts +19 -9
- package/src/contracts/inbox.ts +7 -2
- package/src/contracts/multicall.ts +12 -10
- package/src/contracts/rollup.ts +374 -236
- package/src/contracts/slasher_contract.ts +22 -0
- package/src/contracts/tally_slashing_proposer.ts +21 -9
- package/src/deploy_aztec_l1_contracts.ts +557 -0
- package/src/deploy_l1_contract.ts +362 -0
- package/src/forwarder_proxy.ts +108 -0
- package/src/l1_artifacts.ts +14 -6
- package/src/l1_contract_addresses.ts +24 -20
- package/src/l1_reader.ts +10 -2
- package/src/l1_tx_utils/README.md +177 -0
- package/src/l1_tx_utils/config.ts +161 -0
- package/src/l1_tx_utils/constants.ts +29 -0
- package/src/l1_tx_utils/factory.ts +64 -0
- package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
- package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
- package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +119 -0
- package/src/l1_tx_utils/index-blobs.ts +2 -0
- package/src/l1_tx_utils/index.ts +14 -0
- package/src/l1_tx_utils/interfaces.ts +86 -0
- package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +738 -0
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +419 -0
- package/src/l1_tx_utils/signer.ts +28 -0
- package/src/l1_tx_utils/types.ts +85 -0
- package/src/l1_tx_utils/utils.ts +16 -0
- package/src/publisher_manager.ts +51 -9
- package/src/queries.ts +24 -10
- package/src/test/chain_monitor.ts +102 -44
- package/src/test/delayed_tx_utils.ts +2 -2
- package/src/test/eth_cheat_codes.ts +150 -31
- package/src/test/rollup_cheat_codes.ts +95 -53
- package/src/test/start_anvil.ts +4 -0
- package/src/test/tx_delayer.ts +5 -3
- package/src/test/upgrade_utils.ts +3 -2
- package/src/types.ts +62 -0
- package/src/utils.ts +41 -184
- package/src/zkPassportVerifierAddress.ts +1 -1
- package/dest/deploy_l1_contracts.d.ts +0 -211
- package/dest/deploy_l1_contracts.d.ts.map +0 -1
- package/dest/deploy_l1_contracts.js +0 -1267
- package/dest/index.d.ts +0 -18
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -17
- package/dest/l1_tx_utils.d.ts +0 -250
- package/dest/l1_tx_utils.d.ts.map +0 -1
- package/dest/l1_tx_utils.js +0 -826
- package/dest/l1_tx_utils_with_blobs.d.ts +0 -19
- package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils_with_blobs.js +0 -85
- package/src/deploy_l1_contracts.ts +0 -1596
- package/src/index.ts +0 -17
- package/src/l1_tx_utils.ts +0 -1105
- package/src/l1_tx_utils_with_blobs.ts +0 -144
package/src/publisher_manager.ts
CHANGED
|
@@ -1,31 +1,73 @@
|
|
|
1
|
+
import { pick } from '@aztec/foundation/collection';
|
|
1
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
3
|
|
|
3
|
-
import { L1TxUtils, TxUtilsState } from './l1_tx_utils.js';
|
|
4
|
+
import { L1TxUtils, TxUtilsState } from './l1_tx_utils/index.js';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
const
|
|
6
|
+
// Defines the order in which we prioritise publishers based on their state (first is better)
|
|
7
|
+
const sortOrder = [
|
|
8
|
+
// Always prefer sending from idle publishers
|
|
9
|
+
TxUtilsState.IDLE,
|
|
10
|
+
// Then from publishers that have sent a tx and it got mined
|
|
11
|
+
TxUtilsState.MINED,
|
|
12
|
+
// Then from publishers that have sent a tx but it's in-flight
|
|
13
|
+
TxUtilsState.SPEED_UP,
|
|
14
|
+
TxUtilsState.SENT,
|
|
15
|
+
// We leave cancelled and not-mined states for last, since these represent failures to mines and could be problematic
|
|
16
|
+
TxUtilsState.CANCELLED,
|
|
17
|
+
TxUtilsState.NOT_MINED,
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
// Which states represent a busy publisher that we should avoid if possible
|
|
21
|
+
const busyStates: TxUtilsState[] = [
|
|
22
|
+
TxUtilsState.SENT,
|
|
23
|
+
TxUtilsState.SPEED_UP,
|
|
24
|
+
TxUtilsState.CANCELLED,
|
|
25
|
+
TxUtilsState.NOT_MINED,
|
|
26
|
+
];
|
|
7
27
|
|
|
8
28
|
export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
|
|
9
29
|
|
|
10
30
|
export class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
|
|
11
|
-
private log = createLogger('
|
|
31
|
+
private log = createLogger('publisher:manager');
|
|
32
|
+
private config: { publisherAllowInvalidStates?: boolean };
|
|
12
33
|
|
|
13
|
-
constructor(
|
|
34
|
+
constructor(
|
|
35
|
+
private publishers: UtilsType[],
|
|
36
|
+
config: { publisherAllowInvalidStates?: boolean },
|
|
37
|
+
) {
|
|
14
38
|
this.log.info(`PublisherManager initialized with ${publishers.length} publishers.`);
|
|
15
39
|
this.publishers = publishers;
|
|
40
|
+
this.config = pick(config, 'publisherAllowInvalidStates');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Loads the state of all publishers and resumes monitoring any pending txs */
|
|
44
|
+
public async loadState(): Promise<void> {
|
|
45
|
+
await Promise.all(this.publishers.map(pub => pub.loadStateAndResumeMonitoring()));
|
|
16
46
|
}
|
|
17
47
|
|
|
18
48
|
// Finds and prioritises available publishers based on
|
|
19
49
|
// 1. Validity as per the provided filter function
|
|
20
50
|
// 2. Validity based on the state the publisher is in
|
|
21
|
-
// 3. Priority based on state as defined
|
|
51
|
+
// 3. Priority based on state as defined by sortOrder
|
|
22
52
|
// 4. Then priority based on highest balance
|
|
23
53
|
// 5. Then priority based on least recently used
|
|
24
54
|
public async getAvailablePublisher(filter: PublisherFilter<UtilsType> = () => true): Promise<UtilsType> {
|
|
55
|
+
this.log.debug(`Getting available publisher`, {
|
|
56
|
+
publishers: this.publishers.map(p => ({
|
|
57
|
+
address: p.getSenderAddress(),
|
|
58
|
+
state: p.state,
|
|
59
|
+
lastMined: p.lastMinedAtBlockNumber,
|
|
60
|
+
})),
|
|
61
|
+
});
|
|
62
|
+
|
|
25
63
|
// Extract the valid publishers
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
)
|
|
64
|
+
let validPublishers = this.publishers.filter((pub: UtilsType) => !busyStates.includes(pub.state) && filter(pub));
|
|
65
|
+
|
|
66
|
+
// If none found but we allow invalid (busy) states, try again including them
|
|
67
|
+
if (validPublishers.length === 0 && this.config.publisherAllowInvalidStates) {
|
|
68
|
+
this.log.warn(`No valid publishers found. Trying again including invalid states.`);
|
|
69
|
+
validPublishers = this.publishers.filter(pub => filter(pub));
|
|
70
|
+
}
|
|
29
71
|
|
|
30
72
|
// Error if none found
|
|
31
73
|
if (validPublishers.length === 0) {
|
package/src/queries.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
|
|
3
|
-
|
|
4
|
-
import { getContract } from 'viem';
|
|
5
2
|
|
|
6
3
|
import type { L1ContractsConfig } from './config.js';
|
|
7
4
|
import { ReadOnlyGovernanceContract } from './contracts/governance.js';
|
|
8
5
|
import { GovernanceProposerContract } from './contracts/governance_proposer.js';
|
|
6
|
+
import { InboxContract } from './contracts/inbox.js';
|
|
9
7
|
import { RollupContract } from './contracts/rollup.js';
|
|
10
8
|
import type { ViemPublicClient } from './types.js';
|
|
11
9
|
|
|
@@ -27,8 +25,9 @@ export async function getL1ContractsConfig(
|
|
|
27
25
|
const rollupAddress = addresses.rollupAddress ?? (await governanceProposer.getRollupAddress());
|
|
28
26
|
const rollup = new RollupContract(publicClient, rollupAddress.toString());
|
|
29
27
|
const slasherProposer = await rollup.getSlashingProposer();
|
|
30
|
-
const
|
|
31
|
-
const
|
|
28
|
+
const slasher = await rollup.getSlasherContract();
|
|
29
|
+
const rollupAddresses = await rollup.getRollupAddresses();
|
|
30
|
+
const inboxContract = new InboxContract(publicClient, rollupAddresses.inboxAddress.toString());
|
|
32
31
|
|
|
33
32
|
const [
|
|
34
33
|
l1StartBlock,
|
|
@@ -37,8 +36,12 @@ export async function getL1ContractsConfig(
|
|
|
37
36
|
aztecSlotDuration,
|
|
38
37
|
aztecProofSubmissionEpochs,
|
|
39
38
|
aztecTargetCommitteeSize,
|
|
39
|
+
lagInEpochsForValidatorSet,
|
|
40
|
+
lagInEpochsForRandao,
|
|
41
|
+
inboxLag,
|
|
40
42
|
activationThreshold,
|
|
41
43
|
ejectionThreshold,
|
|
44
|
+
localEjectionThreshold,
|
|
42
45
|
governanceProposerQuorum,
|
|
43
46
|
governanceProposerRoundSize,
|
|
44
47
|
slashingQuorum,
|
|
@@ -48,6 +51,7 @@ export async function getL1ContractsConfig(
|
|
|
48
51
|
slashingOffsetInRounds,
|
|
49
52
|
slashingAmounts,
|
|
50
53
|
slashingVetoer,
|
|
54
|
+
slashingDisableDuration,
|
|
51
55
|
manaTarget,
|
|
52
56
|
provingCostPerMana,
|
|
53
57
|
rollupVersion,
|
|
@@ -60,8 +64,12 @@ export async function getL1ContractsConfig(
|
|
|
60
64
|
rollup.getSlotDuration(),
|
|
61
65
|
rollup.getProofSubmissionEpochs(),
|
|
62
66
|
rollup.getTargetCommitteeSize(),
|
|
67
|
+
rollup.getLagInEpochsForValidatorSet(),
|
|
68
|
+
rollup.getLagInEpochsForRandao(),
|
|
69
|
+
inboxContract.getLag(),
|
|
63
70
|
rollup.getActivationThreshold(),
|
|
64
71
|
rollup.getEjectionThreshold(),
|
|
72
|
+
rollup.getLocalEjectionThreshold(),
|
|
65
73
|
governanceProposer.getQuorumSize(),
|
|
66
74
|
governanceProposer.getRoundSize(),
|
|
67
75
|
slasherProposer?.getQuorumSize() ?? 0n,
|
|
@@ -70,7 +78,8 @@ export async function getL1ContractsConfig(
|
|
|
70
78
|
slasherProposer?.getExecutionDelayInRounds() ?? 0n,
|
|
71
79
|
slasherProposer?.type === 'tally' ? slasherProposer.getSlashOffsetInRounds() : 0n,
|
|
72
80
|
slasherProposer?.type === 'tally' ? slasherProposer.getSlashingAmounts() : [0n, 0n, 0n],
|
|
73
|
-
slasher
|
|
81
|
+
slasher?.getVetoer() ?? EthAddress.ZERO,
|
|
82
|
+
slasher?.getSlashingDisableDuration() ?? 0,
|
|
74
83
|
rollup.getManaTarget(),
|
|
75
84
|
rollup.getProvingCostPerMana(),
|
|
76
85
|
rollup.getVersion(),
|
|
@@ -85,19 +94,24 @@ export async function getL1ContractsConfig(
|
|
|
85
94
|
aztecSlotDuration: Number(aztecSlotDuration),
|
|
86
95
|
aztecProofSubmissionEpochs: Number(aztecProofSubmissionEpochs),
|
|
87
96
|
aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
|
|
97
|
+
lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
|
|
98
|
+
lagInEpochsForRandao: Number(lagInEpochsForRandao),
|
|
99
|
+
inboxLag: Number(inboxLag),
|
|
88
100
|
governanceProposerQuorum: Number(governanceProposerQuorum),
|
|
89
101
|
governanceProposerRoundSize: Number(governanceProposerRoundSize),
|
|
90
102
|
activationThreshold,
|
|
91
103
|
ejectionThreshold,
|
|
104
|
+
localEjectionThreshold,
|
|
92
105
|
slashingQuorum: Number(slashingQuorum),
|
|
93
|
-
slashingRoundSizeInEpochs: Number(slashingRoundSize / aztecEpochDuration),
|
|
106
|
+
slashingRoundSizeInEpochs: Number(Number(slashingRoundSize) / aztecEpochDuration),
|
|
94
107
|
slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
|
|
95
108
|
slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
|
|
96
|
-
slashingVetoer
|
|
97
|
-
|
|
109
|
+
slashingVetoer,
|
|
110
|
+
slashingDisableDuration,
|
|
111
|
+
manaTarget,
|
|
98
112
|
provingCostPerMana: provingCostPerMana,
|
|
99
113
|
rollupVersion: Number(rollupVersion),
|
|
100
|
-
genesisArchiveTreeRoot,
|
|
114
|
+
genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
|
|
101
115
|
exitDelaySeconds: Number(exitDelay),
|
|
102
116
|
slasherFlavor: slasherProposer?.type ?? 'tally',
|
|
103
117
|
slashingOffsetInRounds: Number(slashingOffsetInRounds),
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RollupContract } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { InboxContract } from '@aztec/ethereum/contracts';
|
|
3
|
+
import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
5
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
6
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
@@ -10,11 +12,13 @@ import type { ViemClient } from '../types.js';
|
|
|
10
12
|
|
|
11
13
|
export type ChainMonitorEventMap = {
|
|
12
14
|
'l1-block': [{ l1BlockNumber: number; timestamp: bigint }];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
checkpoint: [
|
|
16
|
+
{ checkpointNumber: CheckpointNumber; l1BlockNumber: number; l2SlotNumber: SlotNumber; timestamp: bigint },
|
|
17
|
+
];
|
|
18
|
+
'checkpoint-proven': [{ provenCheckpointNumber: CheckpointNumber; l1BlockNumber: number; timestamp: bigint }];
|
|
15
19
|
'l2-messages': [{ totalL2Messages: number; l1BlockNumber: number }];
|
|
16
|
-
'l2-epoch': [{ l2EpochNumber:
|
|
17
|
-
'l2-slot': [{ l2SlotNumber:
|
|
20
|
+
'l2-epoch': [{ l2EpochNumber: EpochNumber; timestamp: bigint; committee: EthAddress[] | undefined }];
|
|
21
|
+
'l2-slot': [{ l2SlotNumber: SlotNumber; timestamp: bigint }];
|
|
18
22
|
};
|
|
19
23
|
|
|
20
24
|
/** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
|
|
@@ -27,20 +31,20 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
27
31
|
|
|
28
32
|
/** Current L1 block number */
|
|
29
33
|
public l1BlockNumber!: number;
|
|
30
|
-
/** Current
|
|
31
|
-
public
|
|
32
|
-
/** Current
|
|
33
|
-
public
|
|
34
|
-
/** L1 timestamp for the current
|
|
35
|
-
public
|
|
36
|
-
/** L1 timestamp for the proven
|
|
37
|
-
public
|
|
34
|
+
/** Current checkpoint number */
|
|
35
|
+
public checkpointNumber!: CheckpointNumber;
|
|
36
|
+
/** Current proven checkpoint number */
|
|
37
|
+
public provenCheckpointNumber!: CheckpointNumber;
|
|
38
|
+
/** L1 timestamp for the current checkpoint */
|
|
39
|
+
public checkpointTimestamp!: bigint;
|
|
40
|
+
/** L1 timestamp for the proven checkpoint */
|
|
41
|
+
public provenCheckpointTimestamp!: bigint;
|
|
38
42
|
/** Total number of L2 messages pushed into the Inbox */
|
|
39
43
|
public totalL2Messages: number = 0;
|
|
40
44
|
/** Current L2 epoch number */
|
|
41
|
-
public l2EpochNumber!:
|
|
45
|
+
public l2EpochNumber!: EpochNumber;
|
|
42
46
|
/** Current L2 slot number */
|
|
43
|
-
public l2SlotNumber!:
|
|
47
|
+
public l2SlotNumber!: SlotNumber;
|
|
44
48
|
|
|
45
49
|
constructor(
|
|
46
50
|
private readonly rollup: RollupContract,
|
|
@@ -102,30 +106,40 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
102
106
|
}
|
|
103
107
|
this.l1BlockNumber = newL1BlockNumber;
|
|
104
108
|
|
|
105
|
-
const
|
|
106
|
-
|
|
109
|
+
const [l2SlotNumber, l2Epoch, l1block] = await Promise.all([
|
|
110
|
+
this.rollup.getSlotNumber(),
|
|
111
|
+
this.rollup.getCurrentEpoch(),
|
|
112
|
+
this.l1Client.getBlock({ blockNumber: BigInt(newL1BlockNumber), includeTransactions: false }),
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
const timestamp = l1block.timestamp;
|
|
107
116
|
const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
|
|
108
117
|
|
|
109
118
|
this.emit('l1-block', { l1BlockNumber: newL1BlockNumber, timestamp });
|
|
110
119
|
let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
|
|
111
120
|
|
|
112
|
-
const
|
|
113
|
-
if (this.
|
|
114
|
-
const epochNumber = await this.rollup.
|
|
115
|
-
msg += ` with new
|
|
116
|
-
this.
|
|
117
|
-
this.
|
|
118
|
-
this.emit('
|
|
121
|
+
const newCheckpointNumber = await this.rollup.getCheckpointNumber();
|
|
122
|
+
if (this.checkpointNumber !== newCheckpointNumber) {
|
|
123
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newCheckpointNumber);
|
|
124
|
+
msg += ` with new checkpoint ${newCheckpointNumber} for epoch ${epochNumber}`;
|
|
125
|
+
this.checkpointNumber = newCheckpointNumber;
|
|
126
|
+
this.checkpointTimestamp = timestamp;
|
|
127
|
+
this.emit('checkpoint', {
|
|
128
|
+
checkpointNumber: newCheckpointNumber,
|
|
129
|
+
l1BlockNumber: newL1BlockNumber,
|
|
130
|
+
l2SlotNumber,
|
|
131
|
+
timestamp,
|
|
132
|
+
});
|
|
119
133
|
}
|
|
120
134
|
|
|
121
|
-
const
|
|
122
|
-
if (this.
|
|
123
|
-
const epochNumber = await this.rollup.
|
|
124
|
-
msg += ` with proof up to
|
|
125
|
-
this.
|
|
126
|
-
this.
|
|
127
|
-
this.emit('
|
|
128
|
-
|
|
135
|
+
const newProvenCheckpointNumber = await this.rollup.getProvenCheckpointNumber();
|
|
136
|
+
if (this.provenCheckpointNumber !== newProvenCheckpointNumber) {
|
|
137
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newProvenCheckpointNumber);
|
|
138
|
+
msg += ` with proof up to checkpoint ${newProvenCheckpointNumber} for epoch ${epochNumber}`;
|
|
139
|
+
this.provenCheckpointNumber = newProvenCheckpointNumber;
|
|
140
|
+
this.provenCheckpointTimestamp = timestamp;
|
|
141
|
+
this.emit('checkpoint-proven', {
|
|
142
|
+
provenCheckpointNumber: newProvenCheckpointNumber,
|
|
129
143
|
l1BlockNumber: newL1BlockNumber,
|
|
130
144
|
timestamp,
|
|
131
145
|
});
|
|
@@ -139,19 +153,17 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
139
153
|
this.emit('l2-messages', { totalL2Messages: newTotalL2Messages, l1BlockNumber: newL1BlockNumber });
|
|
140
154
|
}
|
|
141
155
|
|
|
142
|
-
const [l2SlotNumber, l2Epoch] = await Promise.all([this.rollup.getSlotNumber(), this.rollup.getCurrentEpoch()]);
|
|
143
|
-
|
|
144
156
|
let committee: EthAddress[] | undefined;
|
|
145
157
|
if (l2Epoch !== this.l2EpochNumber) {
|
|
146
158
|
this.l2EpochNumber = l2Epoch;
|
|
147
|
-
committee =
|
|
148
|
-
this.emit('l2-epoch', { l2EpochNumber:
|
|
159
|
+
committee = await this.rollup.getCurrentEpochCommittee();
|
|
160
|
+
this.emit('l2-epoch', { l2EpochNumber: l2Epoch, timestamp, committee });
|
|
149
161
|
msg += ` starting new epoch ${this.l2EpochNumber} `;
|
|
150
162
|
}
|
|
151
163
|
|
|
152
164
|
if (l2SlotNumber !== this.l2SlotNumber) {
|
|
153
165
|
this.l2SlotNumber = l2SlotNumber;
|
|
154
|
-
this.emit('l2-slot', { l2SlotNumber
|
|
166
|
+
this.emit('l2-slot', { l2SlotNumber, timestamp });
|
|
155
167
|
}
|
|
156
168
|
|
|
157
169
|
this.logger.info(msg, {
|
|
@@ -160,8 +172,8 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
160
172
|
l1BlockNumber: this.l1BlockNumber,
|
|
161
173
|
l2SlotNumber,
|
|
162
174
|
l2Epoch,
|
|
163
|
-
|
|
164
|
-
|
|
175
|
+
checkpointNumber: this.checkpointNumber,
|
|
176
|
+
provenCheckpointNumber: this.provenCheckpointNumber,
|
|
165
177
|
totalL2Messages: this.totalL2Messages,
|
|
166
178
|
committee,
|
|
167
179
|
});
|
|
@@ -169,14 +181,13 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
169
181
|
return this;
|
|
170
182
|
}
|
|
171
183
|
|
|
172
|
-
public waitUntilL2Slot(slot:
|
|
173
|
-
|
|
174
|
-
if (this.l2SlotNumber >= targetSlot) {
|
|
184
|
+
public waitUntilL2Slot(slot: SlotNumber): Promise<void> {
|
|
185
|
+
if (this.l2SlotNumber >= slot) {
|
|
175
186
|
return Promise.resolve();
|
|
176
187
|
}
|
|
177
188
|
return new Promise(resolve => {
|
|
178
|
-
const listener = (data: { l2SlotNumber:
|
|
179
|
-
if (data.l2SlotNumber >=
|
|
189
|
+
const listener = (data: { l2SlotNumber: SlotNumber; timestamp: bigint }) => {
|
|
190
|
+
if (data.l2SlotNumber >= slot) {
|
|
180
191
|
this.off('l2-slot', listener);
|
|
181
192
|
resolve();
|
|
182
193
|
}
|
|
@@ -184,4 +195,51 @@ export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
184
195
|
this.on('l2-slot', listener);
|
|
185
196
|
});
|
|
186
197
|
}
|
|
198
|
+
|
|
199
|
+
public waitUntilL1Block(block: number | bigint): Promise<void> {
|
|
200
|
+
const targetBlock = typeof block === 'bigint' ? block.valueOf() : block;
|
|
201
|
+
if (this.l1BlockNumber >= targetBlock) {
|
|
202
|
+
return Promise.resolve();
|
|
203
|
+
}
|
|
204
|
+
return new Promise(resolve => {
|
|
205
|
+
const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
|
|
206
|
+
if (data.l1BlockNumber >= targetBlock) {
|
|
207
|
+
this.off('l1-block', listener);
|
|
208
|
+
resolve();
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
this.on('l1-block', listener);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public waitUntilL1Timestamp(timestamp: number | bigint): Promise<void> {
|
|
216
|
+
const targetTimestamp = typeof timestamp === 'bigint' ? timestamp.valueOf() : timestamp;
|
|
217
|
+
if (this.l1BlockNumber >= targetTimestamp) {
|
|
218
|
+
return Promise.resolve();
|
|
219
|
+
}
|
|
220
|
+
return new Promise(resolve => {
|
|
221
|
+
const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
|
|
222
|
+
if (data.timestamp >= targetTimestamp) {
|
|
223
|
+
this.off('l1-block', listener);
|
|
224
|
+
resolve();
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
this.on('l1-block', listener);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public waitUntilCheckpoint(checkpointNumber: CheckpointNumber): Promise<void> {
|
|
232
|
+
if (this.checkpointNumber >= checkpointNumber) {
|
|
233
|
+
return Promise.resolve();
|
|
234
|
+
}
|
|
235
|
+
return new Promise(resolve => {
|
|
236
|
+
const listener = (data: { checkpointNumber: CheckpointNumber; timestamp: bigint }) => {
|
|
237
|
+
if (data.checkpointNumber >= checkpointNumber) {
|
|
238
|
+
this.off('checkpoint', listener);
|
|
239
|
+
resolve();
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
this.on('checkpoint', listener);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
187
245
|
}
|
|
@@ -2,8 +2,8 @@ import { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
2
2
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
4
|
|
|
5
|
-
import { type L1TxUtilsConfig, createViemSigner } from '../l1_tx_utils.js';
|
|
6
|
-
import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
|
|
5
|
+
import { type L1TxUtilsConfig, createViemSigner } from '../l1_tx_utils/index.js';
|
|
6
|
+
import { L1TxUtilsWithBlobs } from '../l1_tx_utils/l1_tx_utils_with_blobs.js';
|
|
7
7
|
import type { ExtendedViemWalletClient } from '../types.js';
|
|
8
8
|
import { type Delayer, withDelayer } from './tx_delayer.js';
|
|
9
9
|
|