@aztec/ethereum 0.0.0-test.1 → 0.0.1-commit.017a351
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 +28 -4
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +73 -3
- package/dest/config.d.ts +70 -23
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +151 -34
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/chain_state_override.d.ts +78 -0
- package/dest/contracts/chain_state_override.d.ts.map +1 -0
- package/dest/contracts/chain_state_override.js +137 -0
- package/dest/contracts/empire_base.d.ts +25 -8
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_base.js +75 -2
- 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 +105 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
- package/dest/contracts/fee_asset_price_oracle.js +656 -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 +131 -43
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +281 -87
- package/dest/contracts/governance_proposer.d.ts +49 -13
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +483 -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 +85 -0
- package/dest/contracts/index.d.ts +11 -2
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +10 -1
- 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 +136 -0
- package/dest/contracts/multicall.d.ts.map +1 -0
- package/dest/contracts/multicall.js +264 -0
- package/dest/contracts/outbox.d.ts +64 -0
- package/dest/contracts/outbox.d.ts.map +1 -0
- package/dest/contracts/outbox.js +113 -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 +5526 -52
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +1446 -118
- 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/slashing_proposer.d.ts +133 -15
- package/dest/contracts/slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/slashing_proposer.js +293 -22
- 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 +256 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +411 -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 +79270 -0
- package/dest/l1_artifacts.d.ts.map +1 -0
- package/dest/l1_artifacts.js +151 -0
- package/dest/l1_contract_addresses.d.ts +61 -45
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +99 -76
- package/dest/l1_reader.d.ts +8 -6
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +20 -12
- 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 +113 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.js +658 -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 +328 -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 +58 -0
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
- package/dest/l1_tx_utils/tx_delayer.js +223 -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 +30 -0
- package/dest/publisher_manager.d.ts.map +1 -0
- package/dest/publisher_manager.js +162 -0
- package/dest/queries.d.ts +17 -4
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +120 -12
- package/dest/test/chain_monitor.d.ts +95 -0
- package/dest/test/chain_monitor.d.ts.map +1 -0
- package/dest/test/chain_monitor.js +249 -0
- package/dest/test/eth_cheat_codes.d.ts +237 -0
- package/dest/test/eth_cheat_codes.d.ts.map +1 -0
- package/dest/test/eth_cheat_codes.js +573 -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 +118 -0
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -0
- package/dest/test/rollup_cheat_codes.js +344 -0
- package/dest/test/start_anvil.d.ts +30 -2
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +147 -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 +25 -4
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +142 -91
- package/dest/zkPassportVerifierAddress.d.ts +15 -0
- package/dest/zkPassportVerifierAddress.d.ts.map +1 -0
- package/dest/zkPassportVerifierAddress.js +11 -0
- package/package.json +52 -26
- package/src/account.ts +5 -0
- package/src/client.ts +107 -5
- package/src/config.ts +218 -43
- package/src/contracts/README.md +157 -0
- package/src/contracts/chain_state_override.ts +200 -0
- package/src/contracts/empire_base.ts +77 -7
- package/src/contracts/errors.ts +13 -0
- package/src/contracts/fee_asset_handler.ts +66 -0
- package/src/contracts/fee_asset_price_oracle.ts +285 -0
- package/src/contracts/fee_juice.ts +29 -15
- package/src/contracts/governance.ts +343 -74
- package/src/contracts/governance_proposer.ts +128 -25
- package/src/contracts/gse.ts +88 -0
- package/src/contracts/inbox.ts +123 -0
- package/src/contracts/index.ts +10 -1
- package/src/contracts/log.ts +13 -0
- package/src/contracts/multicall.ts +296 -0
- package/src/contracts/outbox.ts +132 -0
- package/src/contracts/registry.ts +81 -26
- package/src/contracts/rollup.ts +1246 -90
- package/src/contracts/slasher_contract.ts +89 -0
- package/src/contracts/slashing_proposer.ts +296 -27
- package/src/contracts/utils.ts +14 -0
- package/src/deploy_aztec_l1_contracts.ts +646 -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 +231 -0
- package/src/l1_contract_addresses.ts +121 -80
- package/src/l1_reader.ts +31 -16
- 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 +789 -0
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +424 -0
- package/src/l1_tx_utils/signer.ts +28 -0
- package/src/l1_tx_utils/tx_delayer.ts +303 -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 +203 -0
- package/src/queries.ts +149 -17
- package/src/test/chain_monitor.ts +307 -0
- package/src/test/eth_cheat_codes.ts +600 -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 +388 -0
- package/src/test/start_anvil.ts +189 -22
- package/src/test/upgrade_utils.ts +30 -21
- package/src/types.ts +71 -7
- package/src/utils.ts +164 -96
- 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/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/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
package/dest/queries.js
CHANGED
|
@@ -1,35 +1,143 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import { BaseError } from 'viem';
|
|
3
|
+
import { DefaultL1ContractsConfig } from './config.js';
|
|
4
|
+
import { ReadOnlyGovernanceContract } from './contracts/governance.js';
|
|
5
|
+
import { GovernanceProposerContract } from './contracts/governance_proposer.js';
|
|
6
|
+
import { InboxContract } from './contracts/inbox.js';
|
|
2
7
|
import { RollupContract } from './contracts/rollup.js';
|
|
8
|
+
/**
|
|
9
|
+
* Returns the L1 finalized block, or `undefined` if the chain does not yet have one
|
|
10
|
+
* (common on freshly started devnets). Rethrows any other RPC error.
|
|
11
|
+
*/ export async function getFinalizedL1Block(client) {
|
|
12
|
+
try {
|
|
13
|
+
return await client.getBlock({
|
|
14
|
+
blockTag: 'finalized',
|
|
15
|
+
includeTransactions: false
|
|
16
|
+
});
|
|
17
|
+
} catch (err) {
|
|
18
|
+
if (isFinalizedBlockTagNotFoundError(err)) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
throw err;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Error messages returned by popular Ethereum execution clients when
|
|
25
|
+
// eth_getBlockByNumber / eth_call is called with blockTag "finalized" or
|
|
26
|
+
// "safe" and no such block has been produced yet:
|
|
27
|
+
//
|
|
28
|
+
// geth "finalized block not found"
|
|
29
|
+
// "safe block not found"
|
|
30
|
+
// reth "block not found: finalized"
|
|
31
|
+
// "block not found: safe"
|
|
32
|
+
// nethermind "Unknown block error" (same for both tags)
|
|
33
|
+
// besu "Unknown block"
|
|
34
|
+
// erigon 'block "finalized" not available (head block: N)'
|
|
35
|
+
// 'block "safe" not available (head block: N)'
|
|
36
|
+
//
|
|
37
|
+
// A combined regex covers all five:
|
|
38
|
+
const FINALIZED_BLOCK_TAG_NOT_FOUND_MESSAGE_RE = /(finalized|safe) block not found|block not found: (finalized|safe)|unknown block|block "(finalized|safe)" not available/i;
|
|
39
|
+
/**
|
|
40
|
+
* Returns true if the error originates from an RPC call that failed because
|
|
41
|
+
* the "finalized" (or "safe") block tag is not yet available on the chain.
|
|
42
|
+
*/ export function isFinalizedBlockTagNotFoundError(err) {
|
|
43
|
+
if (!err) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (err instanceof BaseError) {
|
|
47
|
+
const hit = err.walk((e)=>matchesFinalizedBlockTagNotFound(e));
|
|
48
|
+
if (hit) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for(let cur = err, i = 0; cur && i < 10; cur = cur.cause, i++){
|
|
53
|
+
if (matchesFinalizedBlockTagNotFound(cur)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function matchesFinalizedBlockTagNotFound(e) {
|
|
60
|
+
if (!e) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const text = `${e.details ?? ''} ${e.message ?? ''} ${e.shortMessage ?? ''}`;
|
|
64
|
+
return FINALIZED_BLOCK_TAG_NOT_FOUND_MESSAGE_RE.test(text);
|
|
65
|
+
}
|
|
3
66
|
/** Reads the L1ContractsConfig from L1 contracts. */ export async function getL1ContractsConfig(publicClient, addresses) {
|
|
4
|
-
const governance = new
|
|
5
|
-
const
|
|
6
|
-
const
|
|
67
|
+
const governance = new ReadOnlyGovernanceContract(addresses.governanceAddress.toString(), publicClient);
|
|
68
|
+
const governanceProposerAddress = await governance.getGovernanceProposerAddress();
|
|
69
|
+
const governanceProposer = new GovernanceProposerContract(publicClient, governanceProposerAddress.toString());
|
|
70
|
+
const rollupAddress = addresses.rollupAddress ?? await governanceProposer.getRollupAddress();
|
|
7
71
|
const rollup = new RollupContract(publicClient, rollupAddress.toString());
|
|
8
72
|
const slasherProposer = await rollup.getSlashingProposer();
|
|
9
|
-
const
|
|
73
|
+
const slasher = await rollup.getSlasherContract();
|
|
74
|
+
const rollupAddresses = await rollup.getRollupAddresses();
|
|
75
|
+
const inboxContract = new InboxContract(publicClient, rollupAddresses.inboxAddress.toString());
|
|
76
|
+
const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecSlotDuration, aztecProofSubmissionEpochs, aztecTargetCommitteeSize, lagInEpochsForValidatorSet, lagInEpochsForRandao, inboxLag, activationThreshold, ejectionThreshold, localEjectionThreshold, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize, slashingLifetimeInRounds, slashingExecutionDelayInRounds, slashingOffsetInRounds, slashingAmounts, slashingVetoer, slashingDisableDuration, manaTarget, provingCostPerMana, rollupVersion, genesisArchiveTreeRoot, exitDelay] = await Promise.all([
|
|
10
77
|
rollup.getL1StartBlock(),
|
|
11
78
|
rollup.getL1GenesisTime(),
|
|
12
79
|
rollup.getEpochDuration(),
|
|
13
|
-
rollup.getProofSubmissionWindow(),
|
|
14
80
|
rollup.getSlotDuration(),
|
|
81
|
+
rollup.getProofSubmissionEpochs(),
|
|
15
82
|
rollup.getTargetCommitteeSize(),
|
|
16
|
-
rollup.
|
|
83
|
+
rollup.getLagInEpochsForValidatorSet(),
|
|
84
|
+
rollup.getLagInEpochsForRandao(),
|
|
85
|
+
inboxContract.getLag(),
|
|
86
|
+
rollup.getActivationThreshold(),
|
|
87
|
+
rollup.getEjectionThreshold(),
|
|
88
|
+
rollup.getLocalEjectionThreshold(),
|
|
17
89
|
governanceProposer.getQuorumSize(),
|
|
18
90
|
governanceProposer.getRoundSize(),
|
|
19
|
-
slasherProposer
|
|
20
|
-
slasherProposer
|
|
91
|
+
slasherProposer?.getQuorumSize() ?? 0n,
|
|
92
|
+
slasherProposer?.getRoundSize() ?? 0n,
|
|
93
|
+
slasherProposer?.getLifetimeInRounds() ?? 0n,
|
|
94
|
+
slasherProposer?.getExecutionDelayInRounds() ?? 0n,
|
|
95
|
+
slasherProposer?.getSlashOffsetInRounds() ?? 0n,
|
|
96
|
+
slasherProposer?.getSlashingAmounts() ?? [
|
|
97
|
+
0n,
|
|
98
|
+
0n,
|
|
99
|
+
0n
|
|
100
|
+
],
|
|
101
|
+
slasher?.getVetoer() ?? EthAddress.ZERO,
|
|
102
|
+
slasher?.getSlashingDisableDuration() ?? 0,
|
|
103
|
+
rollup.getManaTarget(),
|
|
104
|
+
rollup.getProvingCostPerMana(),
|
|
105
|
+
rollup.getVersion(),
|
|
106
|
+
rollup.getGenesisArchiveTreeRoot(),
|
|
107
|
+
rollup.getExitDelay()
|
|
21
108
|
]);
|
|
22
109
|
return {
|
|
23
110
|
l1StartBlock,
|
|
24
111
|
l1GenesisTime,
|
|
25
112
|
aztecEpochDuration: Number(aztecEpochDuration),
|
|
26
|
-
aztecProofSubmissionWindow: Number(aztecProofSubmissionWindow),
|
|
27
113
|
aztecSlotDuration: Number(aztecSlotDuration),
|
|
114
|
+
aztecProofSubmissionEpochs: Number(aztecProofSubmissionEpochs),
|
|
28
115
|
aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
|
|
116
|
+
lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
|
|
117
|
+
lagInEpochsForRandao: Number(lagInEpochsForRandao),
|
|
118
|
+
inboxLag: Number(inboxLag),
|
|
29
119
|
governanceProposerQuorum: Number(governanceProposerQuorum),
|
|
30
120
|
governanceProposerRoundSize: Number(governanceProposerRoundSize),
|
|
31
|
-
|
|
121
|
+
governanceVotingDuration: DefaultL1ContractsConfig.governanceVotingDuration,
|
|
122
|
+
activationThreshold,
|
|
123
|
+
ejectionThreshold,
|
|
124
|
+
localEjectionThreshold,
|
|
32
125
|
slashingQuorum: Number(slashingQuorum),
|
|
33
|
-
|
|
126
|
+
slashingRoundSizeInEpochs: Number(Number(slashingRoundSize) / aztecEpochDuration),
|
|
127
|
+
slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
|
|
128
|
+
slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
|
|
129
|
+
slashingVetoer,
|
|
130
|
+
slashingDisableDuration,
|
|
131
|
+
manaTarget,
|
|
132
|
+
provingCostPerMana: provingCostPerMana,
|
|
133
|
+
rollupVersion: Number(rollupVersion),
|
|
134
|
+
genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
|
|
135
|
+
exitDelaySeconds: Number(exitDelay),
|
|
136
|
+
slasherEnabled: !!slasherProposer,
|
|
137
|
+
slashingOffsetInRounds: Number(slashingOffsetInRounds),
|
|
138
|
+
slashAmountSmall: slashingAmounts[0],
|
|
139
|
+
slashAmountMedium: slashingAmounts[1],
|
|
140
|
+
slashAmountLarge: slashingAmounts[2],
|
|
141
|
+
initialEthPerFeeAsset: DefaultL1ContractsConfig.initialEthPerFeeAsset
|
|
34
142
|
};
|
|
35
143
|
}
|
|
@@ -0,0 +1,95 @@
|
|
|
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 { DateProvider } from '@aztec/foundation/timer';
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
/** L2 fee data reported by the chain monitor. */
|
|
8
|
+
export type L2FeeData = ManaMinFeeComponents & {
|
|
9
|
+
/** Total minimum fee per mana in Fee Juice (sum of sequencerCost + proverCost + congestionCost). */
|
|
10
|
+
minFeePerMana: bigint;
|
|
11
|
+
/** L1 base fee observed by the oracle. */
|
|
12
|
+
l1BaseFee: bigint;
|
|
13
|
+
/** L1 blob fee observed by the oracle. */
|
|
14
|
+
l1BlobFee: bigint;
|
|
15
|
+
/** ETH per fee asset exchange rate (1e12 precision). */
|
|
16
|
+
ethPerFeeAsset: bigint;
|
|
17
|
+
/** Mana target per checkpoint. */
|
|
18
|
+
manaTarget: bigint;
|
|
19
|
+
};
|
|
20
|
+
export type ChainMonitorEventMap = {
|
|
21
|
+
'l1-block': [{
|
|
22
|
+
l1BlockNumber: number;
|
|
23
|
+
timestamp: bigint;
|
|
24
|
+
}];
|
|
25
|
+
checkpoint: [
|
|
26
|
+
{
|
|
27
|
+
checkpointNumber: CheckpointNumber;
|
|
28
|
+
l1BlockNumber: number;
|
|
29
|
+
l2SlotNumber: SlotNumber;
|
|
30
|
+
timestamp: bigint;
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
'checkpoint-proven': [{
|
|
34
|
+
provenCheckpointNumber: CheckpointNumber;
|
|
35
|
+
l1BlockNumber: number;
|
|
36
|
+
timestamp: bigint;
|
|
37
|
+
}];
|
|
38
|
+
'l2-messages': [{
|
|
39
|
+
totalL2Messages: number;
|
|
40
|
+
l1BlockNumber: number;
|
|
41
|
+
}];
|
|
42
|
+
'l2-epoch': [{
|
|
43
|
+
l2EpochNumber: EpochNumber;
|
|
44
|
+
timestamp: bigint;
|
|
45
|
+
committee: EthAddress[] | undefined;
|
|
46
|
+
}];
|
|
47
|
+
'l2-slot': [{
|
|
48
|
+
l2SlotNumber: SlotNumber;
|
|
49
|
+
timestamp: bigint;
|
|
50
|
+
}];
|
|
51
|
+
'l2-fees': [L2FeeData];
|
|
52
|
+
};
|
|
53
|
+
/** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
|
|
54
|
+
export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
55
|
+
private readonly rollup;
|
|
56
|
+
private readonly dateProvider;
|
|
57
|
+
private readonly logger;
|
|
58
|
+
private readonly intervalMs;
|
|
59
|
+
private readonly l1Client;
|
|
60
|
+
private inbox;
|
|
61
|
+
private handle;
|
|
62
|
+
private running;
|
|
63
|
+
/** Current L1 block number */
|
|
64
|
+
l1BlockNumber: number;
|
|
65
|
+
/** Current checkpoint number */
|
|
66
|
+
checkpointNumber: CheckpointNumber;
|
|
67
|
+
/** Current proven checkpoint number */
|
|
68
|
+
provenCheckpointNumber: CheckpointNumber;
|
|
69
|
+
/** L1 timestamp for the current checkpoint */
|
|
70
|
+
checkpointTimestamp: bigint;
|
|
71
|
+
/** L1 timestamp for the proven checkpoint */
|
|
72
|
+
provenCheckpointTimestamp: bigint;
|
|
73
|
+
/** Total number of L2 messages pushed into the Inbox */
|
|
74
|
+
totalL2Messages: number;
|
|
75
|
+
/** Current L2 epoch number */
|
|
76
|
+
l2EpochNumber: EpochNumber;
|
|
77
|
+
/** Current L2 slot number */
|
|
78
|
+
l2SlotNumber: SlotNumber;
|
|
79
|
+
/** Current L2 fee data (components of the minimum fee per mana). */
|
|
80
|
+
l2FeeData: L2FeeData;
|
|
81
|
+
constructor(rollup: RollupContract, dateProvider?: DateProvider, logger?: import("@aztec/foundation/log").Logger, intervalMs?: number);
|
|
82
|
+
start(): this;
|
|
83
|
+
stop(): Promise<void>;
|
|
84
|
+
protected getInbox(): Promise<InboxContract>;
|
|
85
|
+
protected safeRun(): void;
|
|
86
|
+
run(force?: boolean): Promise<this>;
|
|
87
|
+
waitUntilL2Slot(slot: SlotNumber): Promise<void>;
|
|
88
|
+
waitUntilNextL2Slot(): Promise<void>;
|
|
89
|
+
waitUntilL1Block(block: number | bigint): Promise<void>;
|
|
90
|
+
waitUntilL1Timestamp(timestamp: number | bigint): Promise<void>;
|
|
91
|
+
waitUntilCheckpoint(checkpointNumber: CheckpointNumber): Promise<void>;
|
|
92
|
+
private fetchFeeData;
|
|
93
|
+
private hasFeeDataChanged;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5fbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvY2hhaW5fbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsaURBQWlEO0FBQ2pELE1BQU0sTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEdBQUc7SUFDN0Msb0dBQW9HO0lBQ3BHLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsMENBQTBDO0lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsMENBQTBDO0lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsd0RBQXdEO0lBQ3hELGNBQWMsRUFBRSxNQUFNLENBQUM7SUFDdkIsa0NBQWtDO0lBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUM7Q0FDcEIsQ0FBQztBQUVGLE1BQU0sTUFBTSxvQkFBb0IsR0FBRztJQUNqQyxVQUFVLEVBQUUsQ0FBQztRQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQzNELFVBQVUsRUFBRTtRQUNWO1lBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7WUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO1lBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztZQUFDLFNBQVMs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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain_monitor.d.ts","sourceRoot":"","sources":["../../src/test/chain_monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { InboxContract } from '@aztec/ethereum/contracts';
|
|
2
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
5
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
/** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */ export class ChainMonitor extends EventEmitter {
|
|
8
|
+
rollup;
|
|
9
|
+
dateProvider;
|
|
10
|
+
logger;
|
|
11
|
+
intervalMs;
|
|
12
|
+
l1Client;
|
|
13
|
+
inbox;
|
|
14
|
+
handle;
|
|
15
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
16
|
+
running;
|
|
17
|
+
/** Current L1 block number */ l1BlockNumber;
|
|
18
|
+
/** Current checkpoint number */ checkpointNumber;
|
|
19
|
+
/** Current proven checkpoint number */ provenCheckpointNumber;
|
|
20
|
+
/** L1 timestamp for the current checkpoint */ checkpointTimestamp;
|
|
21
|
+
/** L1 timestamp for the proven checkpoint */ provenCheckpointTimestamp;
|
|
22
|
+
/** Total number of L2 messages pushed into the Inbox */ totalL2Messages;
|
|
23
|
+
/** Current L2 epoch number */ l2EpochNumber;
|
|
24
|
+
/** Current L2 slot number */ l2SlotNumber;
|
|
25
|
+
/** Current L2 fee data (components of the minimum fee per mana). */ l2FeeData;
|
|
26
|
+
constructor(rollup, dateProvider = new DateProvider(), logger = createLogger('aztecjs:utils:chain_monitor'), intervalMs = 200){
|
|
27
|
+
super(), this.rollup = rollup, this.dateProvider = dateProvider, this.logger = logger, this.intervalMs = intervalMs, this.running = new Set(), this.totalL2Messages = 0;
|
|
28
|
+
this.l1Client = rollup.client;
|
|
29
|
+
}
|
|
30
|
+
start() {
|
|
31
|
+
if (this.handle) {
|
|
32
|
+
throw new Error('Chain monitor already started');
|
|
33
|
+
}
|
|
34
|
+
this.handle = setInterval(this.safeRun.bind(this), this.intervalMs);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
async stop() {
|
|
38
|
+
try {
|
|
39
|
+
this.removeAllListeners();
|
|
40
|
+
if (this.handle) {
|
|
41
|
+
clearInterval(this.handle);
|
|
42
|
+
this.handle = undefined;
|
|
43
|
+
}
|
|
44
|
+
await Promise.allSettled([
|
|
45
|
+
...this.running
|
|
46
|
+
]);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
this.logger.error('Error stopping chain monitor', err);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async getInbox() {
|
|
52
|
+
if (!this.inbox) {
|
|
53
|
+
const { inboxAddress } = await this.rollup.getRollupAddresses();
|
|
54
|
+
this.inbox = new InboxContract(this.l1Client, inboxAddress);
|
|
55
|
+
}
|
|
56
|
+
return this.inbox;
|
|
57
|
+
}
|
|
58
|
+
safeRun() {
|
|
59
|
+
const running = promiseWithResolvers();
|
|
60
|
+
this.running.add(running.promise);
|
|
61
|
+
void this.run().catch((error)=>{
|
|
62
|
+
this.logger.error('Error in chain monitor loop', error);
|
|
63
|
+
}).finally(()=>{
|
|
64
|
+
running.resolve();
|
|
65
|
+
this.running.delete(running.promise);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async run(force = false) {
|
|
69
|
+
const newL1BlockNumber = Number(await this.l1Client.getBlockNumber({
|
|
70
|
+
cacheTime: 0
|
|
71
|
+
}));
|
|
72
|
+
if (!force && this.l1BlockNumber === newL1BlockNumber) {
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
this.l1BlockNumber = newL1BlockNumber;
|
|
76
|
+
const [l2SlotNumber, l2Epoch, l1block] = await Promise.all([
|
|
77
|
+
this.rollup.getSlotNumber(),
|
|
78
|
+
this.rollup.getCurrentEpoch(),
|
|
79
|
+
this.l1Client.getBlock({
|
|
80
|
+
blockNumber: BigInt(newL1BlockNumber),
|
|
81
|
+
includeTransactions: false
|
|
82
|
+
})
|
|
83
|
+
]);
|
|
84
|
+
const timestamp = l1block.timestamp;
|
|
85
|
+
const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
|
|
86
|
+
this.emit('l1-block', {
|
|
87
|
+
l1BlockNumber: newL1BlockNumber,
|
|
88
|
+
timestamp
|
|
89
|
+
});
|
|
90
|
+
let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
|
|
91
|
+
const newCheckpointNumber = await this.rollup.getCheckpointNumber();
|
|
92
|
+
if (this.checkpointNumber !== newCheckpointNumber) {
|
|
93
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newCheckpointNumber);
|
|
94
|
+
msg += ` with new checkpoint ${newCheckpointNumber} for epoch ${epochNumber}`;
|
|
95
|
+
this.checkpointNumber = newCheckpointNumber;
|
|
96
|
+
this.checkpointTimestamp = timestamp;
|
|
97
|
+
this.emit('checkpoint', {
|
|
98
|
+
checkpointNumber: newCheckpointNumber,
|
|
99
|
+
l1BlockNumber: newL1BlockNumber,
|
|
100
|
+
l2SlotNumber,
|
|
101
|
+
timestamp
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const newProvenCheckpointNumber = await this.rollup.getProvenCheckpointNumber();
|
|
105
|
+
if (this.provenCheckpointNumber !== newProvenCheckpointNumber) {
|
|
106
|
+
const epochNumber = await this.rollup.getEpochNumberForCheckpoint(newProvenCheckpointNumber);
|
|
107
|
+
msg += ` with proof up to checkpoint ${newProvenCheckpointNumber} for epoch ${epochNumber}`;
|
|
108
|
+
this.provenCheckpointNumber = newProvenCheckpointNumber;
|
|
109
|
+
this.provenCheckpointTimestamp = timestamp;
|
|
110
|
+
this.emit('checkpoint-proven', {
|
|
111
|
+
provenCheckpointNumber: newProvenCheckpointNumber,
|
|
112
|
+
l1BlockNumber: newL1BlockNumber,
|
|
113
|
+
timestamp
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const inbox = await this.getInbox();
|
|
117
|
+
const newTotalL2Messages = await inbox.getState().then((s)=>Number(s.totalMessagesInserted));
|
|
118
|
+
if (this.totalL2Messages !== newTotalL2Messages) {
|
|
119
|
+
msg += ` with ${newTotalL2Messages - this.totalL2Messages} new L2 messages (total ${newTotalL2Messages})`;
|
|
120
|
+
this.totalL2Messages = newTotalL2Messages;
|
|
121
|
+
this.emit('l2-messages', {
|
|
122
|
+
totalL2Messages: newTotalL2Messages,
|
|
123
|
+
l1BlockNumber: newL1BlockNumber
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
let committee;
|
|
127
|
+
if (l2Epoch !== this.l2EpochNumber) {
|
|
128
|
+
this.l2EpochNumber = l2Epoch;
|
|
129
|
+
committee = await this.rollup.getCurrentEpochCommittee();
|
|
130
|
+
this.emit('l2-epoch', {
|
|
131
|
+
l2EpochNumber: l2Epoch,
|
|
132
|
+
timestamp,
|
|
133
|
+
committee
|
|
134
|
+
});
|
|
135
|
+
msg += ` starting new epoch ${this.l2EpochNumber}`;
|
|
136
|
+
}
|
|
137
|
+
if (l2SlotNumber !== this.l2SlotNumber) {
|
|
138
|
+
this.l2SlotNumber = l2SlotNumber;
|
|
139
|
+
this.emit('l2-slot', {
|
|
140
|
+
l2SlotNumber,
|
|
141
|
+
timestamp
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const feeData = await this.fetchFeeData(timestamp);
|
|
145
|
+
if (this.hasFeeDataChanged(feeData)) {
|
|
146
|
+
msg += ` with L2 min fee ${feeData.minFeePerMana}`;
|
|
147
|
+
this.l2FeeData = feeData;
|
|
148
|
+
this.emit('l2-fees', feeData);
|
|
149
|
+
}
|
|
150
|
+
this.logger.info(msg, {
|
|
151
|
+
currentTimestamp: this.dateProvider.nowInSeconds(),
|
|
152
|
+
l1Timestamp: timestamp,
|
|
153
|
+
l1BlockNumber: this.l1BlockNumber,
|
|
154
|
+
l2SlotNumber,
|
|
155
|
+
l2Epoch,
|
|
156
|
+
checkpointNumber: this.checkpointNumber,
|
|
157
|
+
provenCheckpointNumber: this.provenCheckpointNumber,
|
|
158
|
+
totalL2Messages: this.totalL2Messages,
|
|
159
|
+
committee,
|
|
160
|
+
...this.l2FeeData
|
|
161
|
+
});
|
|
162
|
+
return this;
|
|
163
|
+
}
|
|
164
|
+
waitUntilL2Slot(slot) {
|
|
165
|
+
if (this.l2SlotNumber >= slot) {
|
|
166
|
+
return Promise.resolve();
|
|
167
|
+
}
|
|
168
|
+
return new Promise((resolve)=>{
|
|
169
|
+
const listener = (data)=>{
|
|
170
|
+
if (data.l2SlotNumber >= slot) {
|
|
171
|
+
this.off('l2-slot', listener);
|
|
172
|
+
resolve();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
this.on('l2-slot', listener);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async waitUntilNextL2Slot() {
|
|
179
|
+
const targetSlot = SlotNumber.add((await this.run()).l2SlotNumber, 1);
|
|
180
|
+
return this.waitUntilL2Slot(targetSlot);
|
|
181
|
+
}
|
|
182
|
+
waitUntilL1Block(block) {
|
|
183
|
+
const targetBlock = typeof block === 'bigint' ? block.valueOf() : block;
|
|
184
|
+
if (this.l1BlockNumber >= targetBlock) {
|
|
185
|
+
return Promise.resolve();
|
|
186
|
+
}
|
|
187
|
+
return new Promise((resolve)=>{
|
|
188
|
+
const listener = (data)=>{
|
|
189
|
+
if (data.l1BlockNumber >= targetBlock) {
|
|
190
|
+
this.off('l1-block', listener);
|
|
191
|
+
resolve();
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
this.on('l1-block', listener);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
waitUntilL1Timestamp(timestamp) {
|
|
198
|
+
const targetTimestamp = typeof timestamp === 'bigint' ? timestamp.valueOf() : timestamp;
|
|
199
|
+
if (this.l1BlockNumber >= targetTimestamp) {
|
|
200
|
+
return Promise.resolve();
|
|
201
|
+
}
|
|
202
|
+
return new Promise((resolve)=>{
|
|
203
|
+
const listener = (data)=>{
|
|
204
|
+
if (data.timestamp >= targetTimestamp) {
|
|
205
|
+
this.off('l1-block', listener);
|
|
206
|
+
resolve();
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
this.on('l1-block', listener);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
waitUntilCheckpoint(checkpointNumber) {
|
|
213
|
+
if (this.checkpointNumber >= checkpointNumber) {
|
|
214
|
+
return Promise.resolve();
|
|
215
|
+
}
|
|
216
|
+
return new Promise((resolve)=>{
|
|
217
|
+
const listener = (data)=>{
|
|
218
|
+
if (data.checkpointNumber >= checkpointNumber) {
|
|
219
|
+
this.off('checkpoint', listener);
|
|
220
|
+
resolve();
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
this.on('checkpoint', listener);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async fetchFeeData(timestamp) {
|
|
227
|
+
const [components, minFeePerMana, l1Fees, ethPerFeeAsset, manaTarget] = await Promise.all([
|
|
228
|
+
this.rollup.getManaMinFeeComponentsAt(timestamp, true),
|
|
229
|
+
this.rollup.getManaMinFeeAt(timestamp, true),
|
|
230
|
+
this.rollup.getL1FeesAt(timestamp),
|
|
231
|
+
this.rollup.getEthPerFeeAsset(),
|
|
232
|
+
this.rollup.getManaTarget()
|
|
233
|
+
]);
|
|
234
|
+
return {
|
|
235
|
+
...components,
|
|
236
|
+
minFeePerMana,
|
|
237
|
+
l1BaseFee: l1Fees.baseFee,
|
|
238
|
+
l1BlobFee: l1Fees.blobFee,
|
|
239
|
+
ethPerFeeAsset,
|
|
240
|
+
manaTarget
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
hasFeeDataChanged(newData) {
|
|
244
|
+
if (!this.l2FeeData) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
return this.l2FeeData.sequencerCost !== newData.sequencerCost || this.l2FeeData.proverCost !== newData.proverCost || this.l2FeeData.congestionCost !== newData.congestionCost || this.l2FeeData.l1BaseFee !== newData.l1BaseFee || this.l2FeeData.l1BlobFee !== newData.l1BlobFee || this.l2FeeData.ethPerFeeAsset !== newData.ethPerFeeAsset;
|
|
248
|
+
}
|
|
249
|
+
}
|