@aztec/ethereum 0.0.0-test.0 → 0.0.1-commit.001888fc
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 +2 -0
- package/dest/account.d.ts.map +1 -0
- package/dest/account.js +4 -0
- package/dest/chain.d.ts +1 -1
- package/dest/client.d.ts +14 -4
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +27 -3
- package/dest/config.d.ts +70 -23
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +155 -34
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts +27 -8
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_base.js +75 -2
- package/dest/contracts/empire_slashing_proposer.d.ts +69 -0
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/empire_slashing_proposer.js +216 -0
- package/dest/contracts/errors.d.ts +7 -0
- package/dest/contracts/errors.d.ts.map +1 -0
- package/dest/contracts/errors.js +12 -0
- package/dest/contracts/fee_asset_handler.d.ts +20 -0
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -0
- package/dest/contracts/fee_asset_handler.js +59 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
- package/dest/contracts/fee_asset_price_oracle.js +651 -0
- package/dest/contracts/fee_juice.d.ts +6 -7
- package/dest/contracts/fee_juice.d.ts.map +1 -1
- package/dest/contracts/fee_juice.js +27 -20
- package/dest/contracts/governance.d.ts +45 -32
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +98 -85
- package/dest/contracts/governance_proposer.d.ts +19 -13
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +441 -26
- package/dest/contracts/gse.d.ts +32 -0
- package/dest/contracts/gse.d.ts.map +1 -0
- package/dest/contracts/gse.js +72 -0
- package/dest/contracts/inbox.d.ts +47 -0
- package/dest/contracts/inbox.d.ts.map +1 -0
- package/dest/contracts/inbox.js +80 -0
- package/dest/contracts/index.d.ts +12 -3
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +11 -2
- package/dest/contracts/log.d.ts +13 -0
- package/dest/contracts/log.d.ts.map +1 -0
- package/dest/contracts/log.js +1 -0
- package/dest/contracts/multicall.d.ts +21 -0
- package/dest/contracts/multicall.d.ts.map +1 -0
- package/dest/contracts/multicall.js +157 -0
- package/dest/contracts/outbox.d.ts +41 -0
- package/dest/contracts/outbox.d.ts.map +1 -0
- package/dest/contracts/outbox.js +86 -0
- package/dest/contracts/registry.d.ts +12 -5
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/registry.js +74 -17
- package/dest/contracts/rollup.d.ts +311 -53
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +1180 -116
- package/dest/contracts/slasher_contract.d.ts +44 -0
- package/dest/contracts/slasher_contract.d.ts.map +1 -0
- package/dest/contracts/slasher_contract.js +75 -0
- package/dest/contracts/tally_slashing_proposer.d.ts +140 -0
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/tally_slashing_proposer.js +320 -0
- package/dest/contracts/utils.d.ts +3 -0
- package/dest/contracts/utils.d.ts.map +1 -0
- package/dest/contracts/utils.js +11 -0
- package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +413 -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 +21 -0
- package/dest/eth-signer/eth-signer.d.ts.map +1 -0
- package/dest/eth-signer/eth-signer.js +5 -0
- package/dest/eth-signer/index.d.ts +2 -0
- package/dest/eth-signer/index.d.ts.map +1 -0
- package/dest/eth-signer/index.js +1 -0
- 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/generated/l1-contracts-defaults.d.ts +30 -0
- package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
- package/dest/generated/l1-contracts-defaults.js +30 -0
- package/dest/l1_artifacts.d.ts +81744 -0
- package/dest/l1_artifacts.d.ts.map +1 -0
- package/dest/l1_artifacts.js +166 -0
- package/dest/l1_contract_addresses.d.ts +24 -4
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +25 -21
- package/dest/l1_reader.d.ts +6 -2
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +20 -9
- package/dest/l1_tx_utils/config.d.ts +65 -0
- package/dest/l1_tx_utils/config.d.ts.map +1 -0
- package/dest/l1_tx_utils/config.js +109 -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 +32 -0
- package/dest/l1_tx_utils/factory.d.ts.map +1 -0
- package/dest/l1_tx_utils/factory.js +22 -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 +42 -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 +13 -0
- package/dest/l1_tx_utils/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/index.js +13 -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 +105 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.js +639 -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 +327 -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/tx_delayer.d.ts +56 -0
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
- package/dest/l1_tx_utils/tx_delayer.js +221 -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 +6 -0
- package/dest/l1_types.d.ts.map +1 -0
- package/dest/l1_types.js +1 -0
- package/dest/publisher_manager.d.ts +16 -0
- package/dest/publisher_manager.d.ts.map +1 -0
- package/dest/publisher_manager.js +88 -0
- package/dest/queries.d.ts +5 -3
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +61 -12
- package/dest/test/chain_monitor.d.ts +94 -0
- package/dest/test/chain_monitor.d.ts.map +1 -0
- package/dest/test/chain_monitor.js +244 -0
- package/dest/test/eth_cheat_codes.d.ts +229 -0
- package/dest/test/eth_cheat_codes.d.ts.map +1 -0
- package/dest/test/eth_cheat_codes.js +560 -0
- package/dest/test/eth_cheat_codes_with_state.d.ts +2 -2
- package/dest/test/eth_cheat_codes_with_state.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes_with_state.js +1 -1
- package/dest/test/index.d.ts +4 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +3 -2
- package/dest/test/rollup_cheat_codes.d.ts +90 -0
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -0
- package/dest/test/rollup_cheat_codes.js +292 -0
- package/dest/test/start_anvil.d.ts +23 -2
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +133 -24
- package/dest/test/upgrade_utils.d.ts +6 -5
- package/dest/test/upgrade_utils.d.ts.map +1 -1
- package/dest/test/upgrade_utils.js +23 -16
- package/dest/types.d.ts +62 -8
- package/dest/types.d.ts.map +1 -1
- package/dest/types.js +3 -1
- package/dest/utils.d.ts +17 -3
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +111 -88
- package/dest/zkPassportVerifierAddress.d.ts +15 -0
- package/dest/zkPassportVerifierAddress.d.ts.map +1 -0
- package/dest/zkPassportVerifierAddress.js +11 -0
- package/package.json +51 -25
- package/src/account.ts +5 -0
- package/src/client.ts +51 -5
- package/src/config.ts +222 -43
- package/src/contracts/README.md +157 -0
- package/src/contracts/empire_base.ts +79 -7
- package/src/contracts/empire_slashing_proposer.ts +265 -0
- package/src/contracts/errors.ts +13 -0
- package/src/contracts/fee_asset_handler.ts +66 -0
- package/src/contracts/fee_asset_price_oracle.ts +280 -0
- package/src/contracts/fee_juice.ts +29 -15
- package/src/contracts/governance.ts +90 -78
- package/src/contracts/governance_proposer.ts +81 -25
- package/src/contracts/gse.ts +88 -0
- package/src/contracts/inbox.ts +115 -0
- package/src/contracts/index.ts +11 -2
- package/src/contracts/log.ts +13 -0
- package/src/contracts/multicall.ts +158 -0
- package/src/contracts/outbox.ts +98 -0
- package/src/contracts/registry.ts +81 -26
- package/src/contracts/rollup.ts +940 -89
- package/src/contracts/slasher_contract.ts +89 -0
- package/src/contracts/tally_slashing_proposer.ts +322 -0
- package/src/contracts/utils.ts +14 -0
- package/src/deploy_aztec_l1_contracts.ts +650 -0
- package/src/deploy_l1_contract.ts +362 -0
- package/src/eth-signer/eth-signer.ts +25 -0
- package/src/eth-signer/index.ts +1 -0
- package/src/forwarder_proxy.ts +108 -0
- package/src/generated/l1-contracts-defaults.ts +32 -0
- package/src/l1_artifacts.ts +254 -0
- package/src/l1_contract_addresses.ts +49 -34
- package/src/l1_reader.ts +30 -10
- package/src/l1_tx_utils/README.md +177 -0
- package/src/l1_tx_utils/config.ts +181 -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 +108 -0
- package/src/l1_tx_utils/index-blobs.ts +2 -0
- package/src/l1_tx_utils/index.ts +15 -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 +766 -0
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +423 -0
- package/src/l1_tx_utils/signer.ts +28 -0
- package/src/l1_tx_utils/tx_delayer.ts +294 -0
- package/src/l1_tx_utils/types.ts +85 -0
- package/src/l1_tx_utils/utils.ts +16 -0
- package/src/l1_types.ts +6 -0
- package/src/publisher_manager.ts +108 -0
- package/src/queries.ts +82 -16
- package/src/test/chain_monitor.ts +302 -0
- package/src/test/eth_cheat_codes.ts +588 -0
- package/src/test/eth_cheat_codes_with_state.ts +1 -1
- package/src/test/index.ts +3 -2
- package/src/test/rollup_cheat_codes.ts +330 -0
- package/src/test/start_anvil.ts +166 -22
- package/src/test/upgrade_utils.ts +30 -21
- package/src/types.ts +71 -7
- package/src/utils.ts +137 -93
- package/src/zkPassportVerifierAddress.ts +15 -0
- package/dest/contracts/forwarder.d.ts +0 -24
- package/dest/contracts/forwarder.d.ts.map +0 -1
- package/dest/contracts/forwarder.js +0 -101
- package/dest/contracts/slashing_proposer.d.ts +0 -21
- package/dest/contracts/slashing_proposer.d.ts.map +0 -1
- package/dest/contracts/slashing_proposer.js +0 -47
- package/dest/deploy_l1_contracts.d.ts +0 -21210
- package/dest/deploy_l1_contracts.d.ts.map +0 -1
- package/dest/deploy_l1_contracts.js +0 -687
- package/dest/eth_cheat_codes.d.ts +0 -147
- package/dest/eth_cheat_codes.d.ts.map +0 -1
- package/dest/eth_cheat_codes.js +0 -303
- package/dest/index.d.ts +0 -14
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -13
- package/dest/l1_tx_utils.d.ts +0 -192
- package/dest/l1_tx_utils.d.ts.map +0 -1
- package/dest/l1_tx_utils.js +0 -641
- package/dest/l1_tx_utils_with_blobs.d.ts +0 -12
- package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils_with_blobs.js +0 -64
- package/dest/test/delayed_tx_utils.d.ts +0 -8
- package/dest/test/delayed_tx_utils.d.ts.map +0 -1
- package/dest/test/delayed_tx_utils.js +0 -21
- package/dest/test/tx_delayer.d.ts +0 -25
- package/dest/test/tx_delayer.d.ts.map +0 -1
- package/dest/test/tx_delayer.js +0 -116
- package/src/contracts/forwarder.ts +0 -132
- package/src/contracts/slashing_proposer.ts +0 -51
- package/src/deploy_l1_contracts.ts +0 -948
- package/src/eth_cheat_codes.ts +0 -314
- package/src/index.ts +0 -13
- package/src/l1_tx_utils.ts +0 -847
- package/src/l1_tx_utils_with_blobs.ts +0 -86
- package/src/test/delayed_tx_utils.ts +0 -24
- package/src/test/tx_delayer.ts +0 -163
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import type { ManaMinFeeComponents, RollupContract } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { InboxContract } from '@aztec/ethereum/contracts';
|
|
3
|
+
import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
4
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
7
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
8
|
+
|
|
9
|
+
import { EventEmitter } from 'events';
|
|
10
|
+
|
|
11
|
+
import type { ViemClient } from '../types.js';
|
|
12
|
+
|
|
13
|
+
/** L2 fee data reported by the chain monitor. */
|
|
14
|
+
export type L2FeeData = ManaMinFeeComponents & {
|
|
15
|
+
/** Total minimum fee per mana in Fee Juice (sum of sequencerCost + proverCost + congestionCost). */
|
|
16
|
+
minFeePerMana: bigint;
|
|
17
|
+
/** L1 base fee observed by the oracle. */
|
|
18
|
+
l1BaseFee: bigint;
|
|
19
|
+
/** L1 blob fee observed by the oracle. */
|
|
20
|
+
l1BlobFee: bigint;
|
|
21
|
+
/** ETH per fee asset exchange rate (1e12 precision). */
|
|
22
|
+
ethPerFeeAsset: bigint;
|
|
23
|
+
/** Mana target per checkpoint. */
|
|
24
|
+
manaTarget: bigint;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type ChainMonitorEventMap = {
|
|
28
|
+
'l1-block': [{ l1BlockNumber: number; timestamp: bigint }];
|
|
29
|
+
checkpoint: [
|
|
30
|
+
{ checkpointNumber: CheckpointNumber; l1BlockNumber: number; l2SlotNumber: SlotNumber; timestamp: bigint },
|
|
31
|
+
];
|
|
32
|
+
'checkpoint-proven': [{ provenCheckpointNumber: CheckpointNumber; l1BlockNumber: number; timestamp: bigint }];
|
|
33
|
+
'l2-messages': [{ totalL2Messages: number; l1BlockNumber: number }];
|
|
34
|
+
'l2-epoch': [{ l2EpochNumber: EpochNumber; timestamp: bigint; committee: EthAddress[] | undefined }];
|
|
35
|
+
'l2-slot': [{ l2SlotNumber: SlotNumber; timestamp: bigint }];
|
|
36
|
+
'l2-fees': [L2FeeData];
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
|
|
40
|
+
export class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
41
|
+
private readonly l1Client: ViemClient;
|
|
42
|
+
private inbox: InboxContract | undefined;
|
|
43
|
+
private handle: NodeJS.Timeout | undefined;
|
|
44
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
45
|
+
private running: Set<Promise<void>> = new Set();
|
|
46
|
+
|
|
47
|
+
/** Current L1 block number */
|
|
48
|
+
public l1BlockNumber!: number;
|
|
49
|
+
/** Current checkpoint number */
|
|
50
|
+
public checkpointNumber!: CheckpointNumber;
|
|
51
|
+
/** Current proven checkpoint number */
|
|
52
|
+
public provenCheckpointNumber!: CheckpointNumber;
|
|
53
|
+
/** L1 timestamp for the current checkpoint */
|
|
54
|
+
public checkpointTimestamp!: bigint;
|
|
55
|
+
/** L1 timestamp for the proven checkpoint */
|
|
56
|
+
public provenCheckpointTimestamp!: bigint;
|
|
57
|
+
/** Total number of L2 messages pushed into the Inbox */
|
|
58
|
+
public totalL2Messages: number = 0;
|
|
59
|
+
/** Current L2 epoch number */
|
|
60
|
+
public l2EpochNumber!: EpochNumber;
|
|
61
|
+
/** Current L2 slot number */
|
|
62
|
+
public l2SlotNumber!: SlotNumber;
|
|
63
|
+
/** Current L2 fee data (components of the minimum fee per mana). */
|
|
64
|
+
public l2FeeData!: L2FeeData;
|
|
65
|
+
|
|
66
|
+
constructor(
|
|
67
|
+
private readonly rollup: RollupContract,
|
|
68
|
+
private readonly dateProvider: DateProvider = new DateProvider(),
|
|
69
|
+
private readonly logger = createLogger('aztecjs:utils:chain_monitor'),
|
|
70
|
+
private readonly intervalMs = 200,
|
|
71
|
+
) {
|
|
72
|
+
super();
|
|
73
|
+
this.l1Client = rollup.client;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
start() {
|
|
77
|
+
if (this.handle) {
|
|
78
|
+
throw new Error('Chain monitor already started');
|
|
79
|
+
}
|
|
80
|
+
this.handle = setInterval(this.safeRun.bind(this), this.intervalMs);
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async stop() {
|
|
85
|
+
try {
|
|
86
|
+
this.removeAllListeners();
|
|
87
|
+
if (this.handle) {
|
|
88
|
+
clearInterval(this.handle!);
|
|
89
|
+
this.handle = undefined;
|
|
90
|
+
}
|
|
91
|
+
await Promise.allSettled([...this.running]);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
this.logger.error('Error stopping chain monitor', err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected async getInbox() {
|
|
98
|
+
if (!this.inbox) {
|
|
99
|
+
const { inboxAddress } = await this.rollup.getRollupAddresses();
|
|
100
|
+
this.inbox = new InboxContract(this.l1Client, inboxAddress);
|
|
101
|
+
}
|
|
102
|
+
return this.inbox;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
protected safeRun() {
|
|
106
|
+
const running = promiseWithResolvers<void>();
|
|
107
|
+
this.running.add(running.promise);
|
|
108
|
+
|
|
109
|
+
void this.run()
|
|
110
|
+
.catch(error => {
|
|
111
|
+
this.logger.error('Error in chain monitor loop', error);
|
|
112
|
+
})
|
|
113
|
+
.finally(() => {
|
|
114
|
+
running.resolve();
|
|
115
|
+
this.running.delete(running.promise);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async run(force = false) {
|
|
120
|
+
const newL1BlockNumber = Number(await this.l1Client.getBlockNumber({ cacheTime: 0 }));
|
|
121
|
+
if (!force && this.l1BlockNumber === newL1BlockNumber) {
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
this.l1BlockNumber = newL1BlockNumber;
|
|
125
|
+
|
|
126
|
+
const [l2SlotNumber, l2Epoch, l1block] = await Promise.all([
|
|
127
|
+
this.rollup.getSlotNumber(),
|
|
128
|
+
this.rollup.getCurrentEpoch(),
|
|
129
|
+
this.l1Client.getBlock({ blockNumber: BigInt(newL1BlockNumber), includeTransactions: false }),
|
|
130
|
+
]);
|
|
131
|
+
|
|
132
|
+
const timestamp = l1block.timestamp;
|
|
133
|
+
const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
|
|
134
|
+
|
|
135
|
+
this.emit('l1-block', { l1BlockNumber: newL1BlockNumber, timestamp });
|
|
136
|
+
let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
|
|
137
|
+
|
|
138
|
+
const newCheckpointNumber = await this.rollup.getCheckpointNumber();
|
|
139
|
+
if (this.checkpointNumber !== newCheckpointNumber) {
|
|
140
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newCheckpointNumber);
|
|
141
|
+
msg += ` with new checkpoint ${newCheckpointNumber} for epoch ${epochNumber}`;
|
|
142
|
+
this.checkpointNumber = newCheckpointNumber;
|
|
143
|
+
this.checkpointTimestamp = timestamp;
|
|
144
|
+
this.emit('checkpoint', {
|
|
145
|
+
checkpointNumber: newCheckpointNumber,
|
|
146
|
+
l1BlockNumber: newL1BlockNumber,
|
|
147
|
+
l2SlotNumber,
|
|
148
|
+
timestamp,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const newProvenCheckpointNumber = await this.rollup.getProvenCheckpointNumber();
|
|
153
|
+
if (this.provenCheckpointNumber !== newProvenCheckpointNumber) {
|
|
154
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newProvenCheckpointNumber);
|
|
155
|
+
msg += ` with proof up to checkpoint ${newProvenCheckpointNumber} for epoch ${epochNumber}`;
|
|
156
|
+
this.provenCheckpointNumber = newProvenCheckpointNumber;
|
|
157
|
+
this.provenCheckpointTimestamp = timestamp;
|
|
158
|
+
this.emit('checkpoint-proven', {
|
|
159
|
+
provenCheckpointNumber: newProvenCheckpointNumber,
|
|
160
|
+
l1BlockNumber: newL1BlockNumber,
|
|
161
|
+
timestamp,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const inbox = await this.getInbox();
|
|
166
|
+
const newTotalL2Messages = await inbox.getState().then(s => Number(s.totalMessagesInserted));
|
|
167
|
+
if (this.totalL2Messages !== newTotalL2Messages) {
|
|
168
|
+
msg += ` with ${newTotalL2Messages - this.totalL2Messages} new L2 messages (total ${newTotalL2Messages})`;
|
|
169
|
+
this.totalL2Messages = newTotalL2Messages;
|
|
170
|
+
this.emit('l2-messages', { totalL2Messages: newTotalL2Messages, l1BlockNumber: newL1BlockNumber });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let committee: EthAddress[] | undefined;
|
|
174
|
+
if (l2Epoch !== this.l2EpochNumber) {
|
|
175
|
+
this.l2EpochNumber = l2Epoch;
|
|
176
|
+
committee = await this.rollup.getCurrentEpochCommittee();
|
|
177
|
+
this.emit('l2-epoch', { l2EpochNumber: l2Epoch, timestamp, committee });
|
|
178
|
+
msg += ` starting new epoch ${this.l2EpochNumber}`;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (l2SlotNumber !== this.l2SlotNumber) {
|
|
182
|
+
this.l2SlotNumber = l2SlotNumber;
|
|
183
|
+
this.emit('l2-slot', { l2SlotNumber, timestamp });
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const feeData = await this.fetchFeeData(timestamp);
|
|
187
|
+
if (this.hasFeeDataChanged(feeData)) {
|
|
188
|
+
msg += ` with L2 min fee ${feeData.minFeePerMana}`;
|
|
189
|
+
this.l2FeeData = feeData;
|
|
190
|
+
this.emit('l2-fees', feeData);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
this.logger.info(msg, {
|
|
194
|
+
currentTimestamp: this.dateProvider.nowInSeconds(),
|
|
195
|
+
l1Timestamp: timestamp,
|
|
196
|
+
l1BlockNumber: this.l1BlockNumber,
|
|
197
|
+
l2SlotNumber,
|
|
198
|
+
l2Epoch,
|
|
199
|
+
checkpointNumber: this.checkpointNumber,
|
|
200
|
+
provenCheckpointNumber: this.provenCheckpointNumber,
|
|
201
|
+
totalL2Messages: this.totalL2Messages,
|
|
202
|
+
committee,
|
|
203
|
+
...this.l2FeeData,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public waitUntilL2Slot(slot: SlotNumber): Promise<void> {
|
|
210
|
+
if (this.l2SlotNumber >= slot) {
|
|
211
|
+
return Promise.resolve();
|
|
212
|
+
}
|
|
213
|
+
return new Promise(resolve => {
|
|
214
|
+
const listener = (data: { l2SlotNumber: SlotNumber; timestamp: bigint }) => {
|
|
215
|
+
if (data.l2SlotNumber >= slot) {
|
|
216
|
+
this.off('l2-slot', listener);
|
|
217
|
+
resolve();
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
this.on('l2-slot', listener);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public waitUntilL1Block(block: number | bigint): Promise<void> {
|
|
225
|
+
const targetBlock = typeof block === 'bigint' ? block.valueOf() : block;
|
|
226
|
+
if (this.l1BlockNumber >= targetBlock) {
|
|
227
|
+
return Promise.resolve();
|
|
228
|
+
}
|
|
229
|
+
return new Promise(resolve => {
|
|
230
|
+
const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
|
|
231
|
+
if (data.l1BlockNumber >= targetBlock) {
|
|
232
|
+
this.off('l1-block', listener);
|
|
233
|
+
resolve();
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
this.on('l1-block', listener);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
public waitUntilL1Timestamp(timestamp: number | bigint): Promise<void> {
|
|
241
|
+
const targetTimestamp = typeof timestamp === 'bigint' ? timestamp.valueOf() : timestamp;
|
|
242
|
+
if (this.l1BlockNumber >= targetTimestamp) {
|
|
243
|
+
return Promise.resolve();
|
|
244
|
+
}
|
|
245
|
+
return new Promise(resolve => {
|
|
246
|
+
const listener = (data: { l1BlockNumber: number; timestamp: bigint }) => {
|
|
247
|
+
if (data.timestamp >= targetTimestamp) {
|
|
248
|
+
this.off('l1-block', listener);
|
|
249
|
+
resolve();
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
this.on('l1-block', listener);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
public waitUntilCheckpoint(checkpointNumber: CheckpointNumber): Promise<void> {
|
|
257
|
+
if (this.checkpointNumber >= checkpointNumber) {
|
|
258
|
+
return Promise.resolve();
|
|
259
|
+
}
|
|
260
|
+
return new Promise(resolve => {
|
|
261
|
+
const listener = (data: { checkpointNumber: CheckpointNumber; timestamp: bigint }) => {
|
|
262
|
+
if (data.checkpointNumber >= checkpointNumber) {
|
|
263
|
+
this.off('checkpoint', listener);
|
|
264
|
+
resolve();
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
this.on('checkpoint', listener);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
private async fetchFeeData(timestamp: bigint): Promise<L2FeeData> {
|
|
272
|
+
const [components, minFeePerMana, l1Fees, ethPerFeeAsset, manaTarget] = await Promise.all([
|
|
273
|
+
this.rollup.getManaMinFeeComponentsAt(timestamp, true),
|
|
274
|
+
this.rollup.getManaMinFeeAt(timestamp, true),
|
|
275
|
+
this.rollup.getL1FeesAt(timestamp),
|
|
276
|
+
this.rollup.getEthPerFeeAsset(),
|
|
277
|
+
this.rollup.getManaTarget(),
|
|
278
|
+
]);
|
|
279
|
+
return {
|
|
280
|
+
...components,
|
|
281
|
+
minFeePerMana,
|
|
282
|
+
l1BaseFee: l1Fees.baseFee,
|
|
283
|
+
l1BlobFee: l1Fees.blobFee,
|
|
284
|
+
ethPerFeeAsset,
|
|
285
|
+
manaTarget,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private hasFeeDataChanged(newData: L2FeeData): boolean {
|
|
290
|
+
if (!this.l2FeeData) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
return (
|
|
294
|
+
this.l2FeeData.sequencerCost !== newData.sequencerCost ||
|
|
295
|
+
this.l2FeeData.proverCost !== newData.proverCost ||
|
|
296
|
+
this.l2FeeData.congestionCost !== newData.congestionCost ||
|
|
297
|
+
this.l2FeeData.l1BaseFee !== newData.l1BaseFee ||
|
|
298
|
+
this.l2FeeData.l1BlobFee !== newData.l1BlobFee ||
|
|
299
|
+
this.l2FeeData.ethPerFeeAsset !== newData.ethPerFeeAsset
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
}
|