@aztec/ethereum 0.0.1-commit.24de95ac → 0.0.1-commit.2e2504e2
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 +1 -1
- package/dest/client.js +6 -2
- package/dest/config.d.ts +22 -68
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +57 -378
- package/dest/constants.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts +7 -5
- 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 +6 -4
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +30 -17
- 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 +6 -5
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.js +11 -9
- 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 +18 -16
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +11 -1
- package/dest/contracts/governance_proposer.d.ts +6 -4
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +403 -11
- package/dest/contracts/gse.d.ts +1 -1
- package/dest/contracts/gse.d.ts.map +1 -1
- package/dest/contracts/inbox.d.ts +24 -3
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +36 -1
- package/dest/contracts/index.d.ts +3 -1
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +2 -0
- 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 +2 -2
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +2 -1
- 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 +1 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/rollup.d.ts +194 -123
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +750 -184
- package/dest/contracts/slasher_contract.d.ts +1 -1
- package/dest/contracts/slasher_contract.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.d.ts +9 -7
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +11 -4
- package/dest/contracts/utils.d.ts +1 -1
- package/dest/deploy_aztec_l1_contracts.d.ts +260 -0
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
- package/dest/deploy_aztec_l1_contracts.js +399 -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/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 +6597 -2046
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_contract_addresses.d.ts +3 -3
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +3 -3
- package/dest/l1_reader.d.ts +3 -1
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +6 -0
- package/dest/l1_tx_utils/config.d.ts +5 -5
- package/dest/l1_tx_utils/config.d.ts.map +1 -1
- package/dest/l1_tx_utils/config.js +30 -7
- package/dest/l1_tx_utils/constants.d.ts +8 -2
- package/dest/l1_tx_utils/constants.d.ts.map +1 -1
- package/dest/l1_tx_utils/constants.js +27 -2
- package/dest/l1_tx_utils/factory.d.ts +1 -1
- 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 +3 -1
- package/dest/l1_tx_utils/index.d.ts.map +1 -1
- package/dest/l1_tx_utils/index.js +2 -0
- package/dest/l1_tx_utils/interfaces.d.ts +2 -2
- package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
- 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 +1 -2
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +23 -10
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +1 -1
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +19 -30
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +55 -163
- package/dest/l1_tx_utils/signer.d.ts +1 -1
- package/dest/l1_tx_utils/types.d.ts +1 -1
- package/dest/l1_tx_utils/types.d.ts.map +1 -1
- package/dest/l1_tx_utils/utils.d.ts +1 -1
- package/dest/l1_types.d.ts +1 -1
- package/dest/publisher_manager.d.ts +3 -2
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +2 -2
- package/dest/queries.d.ts +2 -2
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +16 -6
- package/dest/test/chain_monitor.d.ts +27 -24
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +33 -36
- package/dest/test/delayed_tx_utils.d.ts +1 -1
- package/dest/test/delayed_tx_utils.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.d.ts +11 -3
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +11 -3
- 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 +17 -13
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +62 -38
- 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 +3 -2
- 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/types.d.ts +57 -2
- package/dest/types.d.ts.map +1 -1
- package/dest/utils.d.ts +16 -3
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +64 -0
- package/dest/zkPassportVerifierAddress.d.ts +1 -1
- package/package.json +34 -14
- package/src/client.ts +2 -2
- package/src/config.ts +71 -458
- package/src/contracts/README.md +157 -0
- package/src/contracts/empire_base.ts +6 -5
- package/src/contracts/empire_slashing_proposer.ts +32 -32
- package/src/contracts/fee_asset_handler.ts +10 -7
- package/src/contracts/governance.ts +10 -1
- package/src/contracts/governance_proposer.ts +20 -6
- package/src/contracts/inbox.ts +55 -3
- package/src/contracts/index.ts +2 -0
- package/src/contracts/log.ts +13 -0
- package/src/contracts/multicall.ts +5 -2
- package/src/contracts/outbox.ts +98 -0
- package/src/contracts/rollup.ts +421 -160
- package/src/contracts/tally_slashing_proposer.ts +15 -8
- package/src/deploy_aztec_l1_contracts.ts +623 -0
- package/src/deploy_l1_contract.ts +362 -0
- package/src/forwarder_proxy.ts +108 -0
- package/src/generated/l1-contracts-defaults.ts +32 -0
- package/src/l1_contract_addresses.ts +22 -20
- package/src/l1_reader.ts +8 -0
- package/src/l1_tx_utils/config.ts +32 -11
- package/src/l1_tx_utils/constants.ts +13 -2
- 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 +2 -0
- package/src/l1_tx_utils/interfaces.ts +1 -1
- package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +30 -10
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +69 -209
- package/src/publisher_manager.ts +4 -2
- package/src/queries.ts +17 -6
- package/src/test/chain_monitor.ts +51 -49
- package/src/test/eth_cheat_codes.ts +9 -3
- package/src/test/rollup_cheat_codes.ts +63 -43
- package/src/test/start_anvil.ts +5 -1
- package/src/test/tx_delayer.ts +5 -3
- package/src/types.ts +62 -0
- package/src/utils.ts +83 -1
- package/dest/deploy_l1_contracts.d.ts +0 -226
- package/dest/deploy_l1_contracts.d.ts.map +0 -1
- package/dest/deploy_l1_contracts.js +0 -1473
- package/dest/index.d.ts +0 -18
- package/dest/index.d.ts.map +0 -1
- package/dest/index.js +0 -17
- package/src/deploy_l1_contracts.ts +0 -1849
- package/src/index.ts +0 -17
package/src/contracts/rollup.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
1
4
|
import { memoize } from '@aztec/foundation/decorators';
|
|
2
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
6
|
import type { ViemSignature } from '@aztec/foundation/eth-signature';
|
|
7
|
+
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
8
|
+
import { EscapeHatchAbi } from '@aztec/l1-artifacts/EscapeHatchAbi';
|
|
4
9
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
5
10
|
import { RollupStorage } from '@aztec/l1-artifacts/RollupStorage';
|
|
6
11
|
|
|
@@ -18,7 +23,7 @@ import {
|
|
|
18
23
|
} from 'viem';
|
|
19
24
|
|
|
20
25
|
import { getPublicClient } from '../client.js';
|
|
21
|
-
import type {
|
|
26
|
+
import type { DeployAztecL1ContractsReturnType } from '../deploy_aztec_l1_contracts.js';
|
|
22
27
|
import type { L1ContractAddresses } from '../l1_contract_addresses.js';
|
|
23
28
|
import type { L1ReaderConfig } from '../l1_reader.js';
|
|
24
29
|
import type { L1TxRequest, L1TxUtils } from '../l1_tx_utils/index.js';
|
|
@@ -26,6 +31,7 @@ import type { ViemClient } from '../types.js';
|
|
|
26
31
|
import { formatViemError } from '../utils.js';
|
|
27
32
|
import { EmpireSlashingProposerContract } from './empire_slashing_proposer.js';
|
|
28
33
|
import { GSEContract } from './gse.js';
|
|
34
|
+
import type { L1EventLog } from './log.js';
|
|
29
35
|
import { SlasherContract } from './slasher_contract.js';
|
|
30
36
|
import { TallySlashingProposerContract } from './tally_slashing_proposer.js';
|
|
31
37
|
import { checkBlockTag } from './utils.js';
|
|
@@ -56,12 +62,16 @@ export type L1RollupContractAddresses = Pick<
|
|
|
56
62
|
export type EpochProofPublicInputArgs = {
|
|
57
63
|
previousArchive: `0x${string}`;
|
|
58
64
|
endArchive: `0x${string}`;
|
|
65
|
+
outHash: `0x${string}`;
|
|
59
66
|
proverId: `0x${string}`;
|
|
60
67
|
};
|
|
61
68
|
|
|
62
69
|
export type ViemHeader = {
|
|
63
70
|
lastArchiveRoot: `0x${string}`;
|
|
64
|
-
|
|
71
|
+
blockHeadersHash: `0x${string}`;
|
|
72
|
+
blobsHash: `0x${string}`;
|
|
73
|
+
inHash: `0x${string}`;
|
|
74
|
+
outHash: `0x${string}`;
|
|
65
75
|
slotNumber: bigint;
|
|
66
76
|
timestamp: bigint;
|
|
67
77
|
coinbase: `0x${string}`;
|
|
@@ -70,43 +80,136 @@ export type ViemHeader = {
|
|
|
70
80
|
totalManaUsed: bigint;
|
|
71
81
|
};
|
|
72
82
|
|
|
73
|
-
export type ViemContentCommitment = {
|
|
74
|
-
blobsHash: `0x${string}`;
|
|
75
|
-
inHash: `0x${string}`;
|
|
76
|
-
outHash: `0x${string}`;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
83
|
export type ViemGasFees = {
|
|
80
84
|
feePerDaGas: bigint;
|
|
81
85
|
feePerL2Gas: bigint;
|
|
82
86
|
};
|
|
83
87
|
|
|
84
|
-
export
|
|
85
|
-
|
|
86
|
-
|
|
88
|
+
export enum SlashingProposerType {
|
|
89
|
+
None = 0,
|
|
90
|
+
Tally = 1,
|
|
91
|
+
Empire = 2,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Status of a validator/attester in the staking system.
|
|
96
|
+
* Matches the Status enum in StakingLib.sol
|
|
97
|
+
*/
|
|
98
|
+
export enum AttesterStatus {
|
|
99
|
+
NONE = 0,
|
|
100
|
+
VALIDATING = 1,
|
|
101
|
+
ZOMBIE = 2,
|
|
102
|
+
EXITING = 3,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Fee header data for a checkpoint
|
|
107
|
+
*/
|
|
108
|
+
export type FeeHeader = {
|
|
109
|
+
excessMana: bigint;
|
|
110
|
+
manaUsed: bigint;
|
|
111
|
+
ethPerFeeAsset: bigint;
|
|
112
|
+
congestionCost: bigint;
|
|
113
|
+
proverCost: bigint;
|
|
87
114
|
};
|
|
88
115
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Checkpoint log data returned from the rollup contract
|
|
118
|
+
*/
|
|
119
|
+
export type CheckpointLog = {
|
|
120
|
+
archive: Fr;
|
|
121
|
+
headerHash: Buffer32;
|
|
122
|
+
blobCommitmentsHash: Buffer32;
|
|
123
|
+
attestationsHash: Buffer32;
|
|
124
|
+
payloadDigest: Buffer32;
|
|
125
|
+
slotNumber: SlotNumber;
|
|
126
|
+
feeHeader: FeeHeader;
|
|
93
127
|
};
|
|
94
128
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
129
|
+
/**
|
|
130
|
+
* L1 fee data (base fee and blob fee)
|
|
131
|
+
*/
|
|
132
|
+
export type L1FeeData = {
|
|
133
|
+
baseFee: bigint;
|
|
134
|
+
blobFee: bigint;
|
|
98
135
|
};
|
|
99
136
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
137
|
+
/**
|
|
138
|
+
* Reward configuration for the rollup
|
|
139
|
+
*/
|
|
140
|
+
export type RewardConfig = {
|
|
141
|
+
rewardDistributor: EthAddress;
|
|
142
|
+
sequencerBps: bigint;
|
|
143
|
+
booster: EthAddress;
|
|
144
|
+
checkpointReward: bigint;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Exit information for a validator
|
|
149
|
+
*/
|
|
150
|
+
export type Exit = {
|
|
151
|
+
withdrawalId: bigint;
|
|
152
|
+
amount: bigint;
|
|
153
|
+
exitableAt: bigint;
|
|
154
|
+
recipientOrWithdrawer: EthAddress;
|
|
155
|
+
isRecipient: boolean;
|
|
156
|
+
exists: boolean;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Attester configuration including public key and withdrawer
|
|
161
|
+
*/
|
|
162
|
+
export type AttesterConfig = {
|
|
163
|
+
publicKey: {
|
|
164
|
+
x: bigint;
|
|
165
|
+
y: bigint;
|
|
166
|
+
};
|
|
167
|
+
withdrawer: EthAddress;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Complete view of an attester's state
|
|
172
|
+
*/
|
|
173
|
+
export type AttesterView = {
|
|
174
|
+
status: AttesterStatus;
|
|
175
|
+
effectiveBalance: bigint;
|
|
176
|
+
exit: Exit;
|
|
177
|
+
config: AttesterConfig;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Return for a status call
|
|
182
|
+
*/
|
|
183
|
+
export type RollupStatusResponse = {
|
|
184
|
+
provenCheckpointNumber: CheckpointNumber;
|
|
185
|
+
provenArchive: Fr;
|
|
186
|
+
pendingCheckpointNumber: CheckpointNumber;
|
|
187
|
+
pendingArchive: Fr;
|
|
188
|
+
archiveOfMyCheckpoint: Fr;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/** Arguments for the CheckpointProposed event. */
|
|
192
|
+
export type CheckpointProposedArgs = {
|
|
193
|
+
checkpointNumber: CheckpointNumber;
|
|
194
|
+
archive: Fr;
|
|
195
|
+
versionedBlobHashes: Buffer[];
|
|
196
|
+
/** Hash of attestations. Undefined for older events (backwards compatibility). */
|
|
197
|
+
attestationsHash?: Buffer32;
|
|
198
|
+
/** Digest of the payload. Undefined for older events (backwards compatibility). */
|
|
199
|
+
payloadDigest?: Buffer32;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/** Log type for CheckpointProposed events. */
|
|
203
|
+
export type CheckpointProposedLog = L1EventLog<CheckpointProposedArgs>;
|
|
105
204
|
|
|
106
205
|
export class RollupContract {
|
|
107
206
|
private readonly rollup: GetContractReturnType<typeof RollupAbi, ViemClient>;
|
|
108
207
|
|
|
109
208
|
private static cachedStfStorageSlot: Hex | undefined;
|
|
209
|
+
private cachedEscapeHatch?: {
|
|
210
|
+
address: EthAddress;
|
|
211
|
+
contract: GetContractReturnType<typeof EscapeHatchAbi, ViemClient>;
|
|
212
|
+
};
|
|
110
213
|
|
|
111
214
|
static get checkBlobStorageSlot(): bigint {
|
|
112
215
|
const asString = RollupStorage.find(storage => storage.label === 'checkBlob')?.slot;
|
|
@@ -120,7 +223,7 @@ export class RollupContract {
|
|
|
120
223
|
return (RollupContract.cachedStfStorageSlot ??= keccak256(Buffer.from('aztec.stf.storage', 'utf-8')));
|
|
121
224
|
}
|
|
122
225
|
|
|
123
|
-
static getFromL1ContractsValues(deployL1ContractsValues:
|
|
226
|
+
static getFromL1ContractsValues(deployL1ContractsValues: DeployAztecL1ContractsReturnType) {
|
|
124
227
|
const {
|
|
125
228
|
l1Client,
|
|
126
229
|
l1ContractAddresses: { rollupAddress },
|
|
@@ -144,8 +247,8 @@ export class RollupContract {
|
|
|
144
247
|
this.rollup = getContract({ address, abi: RollupAbi, client });
|
|
145
248
|
}
|
|
146
249
|
|
|
147
|
-
getGSE() {
|
|
148
|
-
return this.rollup.read.getGSE();
|
|
250
|
+
async getGSE(): Promise<EthAddress> {
|
|
251
|
+
return EthAddress.fromString(await this.rollup.read.getGSE());
|
|
149
252
|
}
|
|
150
253
|
|
|
151
254
|
public get address() {
|
|
@@ -187,88 +290,93 @@ export class RollupContract {
|
|
|
187
290
|
}
|
|
188
291
|
|
|
189
292
|
@memoize
|
|
190
|
-
getL1StartBlock() {
|
|
293
|
+
getL1StartBlock(): Promise<bigint> {
|
|
191
294
|
return this.rollup.read.L1_BLOCK_AT_GENESIS();
|
|
192
295
|
}
|
|
193
296
|
|
|
194
297
|
@memoize
|
|
195
|
-
getL1GenesisTime() {
|
|
298
|
+
getL1GenesisTime(): Promise<bigint> {
|
|
196
299
|
return this.rollup.read.getGenesisTime();
|
|
197
300
|
}
|
|
198
301
|
|
|
199
302
|
@memoize
|
|
200
|
-
getProofSubmissionEpochs() {
|
|
201
|
-
return this.rollup.read.getProofSubmissionEpochs();
|
|
303
|
+
async getProofSubmissionEpochs(): Promise<number> {
|
|
304
|
+
return Number(await this.rollup.read.getProofSubmissionEpochs());
|
|
202
305
|
}
|
|
203
306
|
|
|
204
307
|
@memoize
|
|
205
|
-
getEpochDuration() {
|
|
206
|
-
return this.rollup.read.getEpochDuration();
|
|
308
|
+
async getEpochDuration(): Promise<number> {
|
|
309
|
+
return Number(await this.rollup.read.getEpochDuration());
|
|
207
310
|
}
|
|
208
311
|
|
|
209
312
|
@memoize
|
|
210
|
-
getSlotDuration() {
|
|
211
|
-
return this.rollup.read.getSlotDuration();
|
|
313
|
+
async getSlotDuration(): Promise<number> {
|
|
314
|
+
return Number(await this.rollup.read.getSlotDuration());
|
|
212
315
|
}
|
|
213
316
|
|
|
214
317
|
@memoize
|
|
215
|
-
getTargetCommitteeSize() {
|
|
216
|
-
return this.rollup.read.getTargetCommitteeSize();
|
|
318
|
+
async getTargetCommitteeSize(): Promise<number> {
|
|
319
|
+
return Number(await this.rollup.read.getTargetCommitteeSize());
|
|
217
320
|
}
|
|
218
321
|
|
|
219
322
|
@memoize
|
|
220
|
-
getEjectionThreshold() {
|
|
323
|
+
getEjectionThreshold(): Promise<bigint> {
|
|
221
324
|
return this.rollup.read.getEjectionThreshold();
|
|
222
325
|
}
|
|
223
326
|
|
|
224
327
|
@memoize
|
|
225
|
-
getLocalEjectionThreshold() {
|
|
328
|
+
getLocalEjectionThreshold(): Promise<bigint> {
|
|
226
329
|
return this.rollup.read.getLocalEjectionThreshold();
|
|
227
330
|
}
|
|
228
331
|
|
|
229
332
|
@memoize
|
|
230
|
-
|
|
231
|
-
return this.rollup.read.
|
|
333
|
+
async getLagInEpochsForValidatorSet(): Promise<number> {
|
|
334
|
+
return Number(await this.rollup.read.getLagInEpochsForValidatorSet());
|
|
232
335
|
}
|
|
233
336
|
|
|
234
337
|
@memoize
|
|
235
|
-
|
|
338
|
+
async getLagInEpochsForRandao(): Promise<number> {
|
|
339
|
+
return Number(await this.rollup.read.getLagInEpochsForRandao());
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@memoize
|
|
343
|
+
getActivationThreshold(): Promise<bigint> {
|
|
236
344
|
return this.rollup.read.getActivationThreshold();
|
|
237
345
|
}
|
|
238
346
|
|
|
239
347
|
@memoize
|
|
240
|
-
getExitDelay() {
|
|
241
|
-
return this.rollup.read.getExitDelay();
|
|
348
|
+
async getExitDelay(): Promise<number> {
|
|
349
|
+
return Number(await this.rollup.read.getExitDelay());
|
|
242
350
|
}
|
|
243
351
|
|
|
244
352
|
@memoize
|
|
245
|
-
getManaTarget() {
|
|
353
|
+
getManaTarget(): Promise<bigint> {
|
|
246
354
|
return this.rollup.read.getManaTarget();
|
|
247
355
|
}
|
|
248
356
|
|
|
249
357
|
@memoize
|
|
250
|
-
getProvingCostPerMana() {
|
|
358
|
+
getProvingCostPerMana(): Promise<bigint> {
|
|
251
359
|
return this.rollup.read.getProvingCostPerManaInEth();
|
|
252
360
|
}
|
|
253
361
|
|
|
254
362
|
@memoize
|
|
255
|
-
getProvingCostPerManaInFeeAsset() {
|
|
363
|
+
getProvingCostPerManaInFeeAsset(): Promise<bigint> {
|
|
256
364
|
return this.rollup.read.getProvingCostPerManaInFeeAsset();
|
|
257
365
|
}
|
|
258
366
|
|
|
259
367
|
@memoize
|
|
260
|
-
getManaLimit() {
|
|
368
|
+
getManaLimit(): Promise<bigint> {
|
|
261
369
|
return this.rollup.read.getManaLimit();
|
|
262
370
|
}
|
|
263
371
|
|
|
264
372
|
@memoize
|
|
265
|
-
getVersion() {
|
|
373
|
+
getVersion(): Promise<bigint> {
|
|
266
374
|
return this.rollup.read.getVersion();
|
|
267
375
|
}
|
|
268
376
|
|
|
269
377
|
@memoize
|
|
270
|
-
async getGenesisArchiveTreeRoot(): Promise
|
|
271
|
-
return await this.rollup.read.archiveAt([0n]);
|
|
378
|
+
async getGenesisArchiveTreeRoot(): Promise<Fr> {
|
|
379
|
+
return Fr.fromString(await this.rollup.read.archiveAt([0n]));
|
|
272
380
|
}
|
|
273
381
|
|
|
274
382
|
/**
|
|
@@ -294,33 +402,85 @@ export class RollupContract {
|
|
|
294
402
|
return {
|
|
295
403
|
l1StartBlock,
|
|
296
404
|
l1GenesisTime,
|
|
297
|
-
slotDuration
|
|
405
|
+
slotDuration,
|
|
298
406
|
epochDuration: Number(epochDuration),
|
|
299
407
|
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
300
408
|
};
|
|
301
409
|
}
|
|
302
410
|
|
|
303
|
-
getSlasherAddress() {
|
|
304
|
-
return this.rollup.read.getSlasher();
|
|
411
|
+
async getSlasherAddress(): Promise<EthAddress> {
|
|
412
|
+
return EthAddress.fromString(await this.rollup.read.getSlasher());
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Returns the configured escape hatch contract address, or zero if disabled.
|
|
417
|
+
*/
|
|
418
|
+
async getEscapeHatchAddress(): Promise<EthAddress> {
|
|
419
|
+
return EthAddress.fromString(await this.rollup.read.getEscapeHatch());
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private async getEscapeHatchContract(): Promise<
|
|
423
|
+
GetContractReturnType<typeof EscapeHatchAbi, ViemClient> | undefined
|
|
424
|
+
> {
|
|
425
|
+
const escapeHatchAddress = await this.getEscapeHatchAddress();
|
|
426
|
+
if (escapeHatchAddress.isZero()) {
|
|
427
|
+
return undefined;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Cache the viem contract wrapper since it will be used frequently.
|
|
431
|
+
if (!this.cachedEscapeHatch || !this.cachedEscapeHatch.address.equals(escapeHatchAddress)) {
|
|
432
|
+
this.cachedEscapeHatch = {
|
|
433
|
+
address: escapeHatchAddress,
|
|
434
|
+
contract: getContract({
|
|
435
|
+
address: escapeHatchAddress.toString(),
|
|
436
|
+
abi: EscapeHatchAbi,
|
|
437
|
+
client: this.client,
|
|
438
|
+
}),
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
return this.cachedEscapeHatch.contract;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Returns whether the escape hatch is open for the given epoch.
|
|
447
|
+
* If escape hatch is not configured, returns false.
|
|
448
|
+
*
|
|
449
|
+
* This function is intentionally defensive: any failure to query the escape hatch
|
|
450
|
+
* (RPC issues, transient errors, etc.) is treated as "closed" to avoid callers
|
|
451
|
+
* needing to sprinkle try/catch everywhere.
|
|
452
|
+
*/
|
|
453
|
+
async isEscapeHatchOpen(epoch: EpochNumber): Promise<boolean> {
|
|
454
|
+
try {
|
|
455
|
+
const escapeHatch = await this.getEscapeHatchContract();
|
|
456
|
+
if (!escapeHatch) {
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const [isOpen] = await escapeHatch.read.isHatchOpen([BigInt(epoch)]);
|
|
461
|
+
return isOpen;
|
|
462
|
+
} catch {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
305
465
|
}
|
|
306
466
|
|
|
307
467
|
/**
|
|
308
468
|
* Returns a SlasherContract instance for interacting with the slasher contract.
|
|
309
469
|
*/
|
|
310
470
|
async getSlasherContract(): Promise<SlasherContract | undefined> {
|
|
311
|
-
const slasherAddress =
|
|
471
|
+
const slasherAddress = await this.getSlasherAddress();
|
|
312
472
|
if (slasherAddress.isZero()) {
|
|
313
473
|
return undefined;
|
|
314
474
|
}
|
|
315
475
|
return new SlasherContract(this.client, slasherAddress);
|
|
316
476
|
}
|
|
317
477
|
|
|
318
|
-
getOwner() {
|
|
319
|
-
return this.rollup.read.owner();
|
|
478
|
+
async getOwner(): Promise<EthAddress> {
|
|
479
|
+
return EthAddress.fromString(await this.rollup.read.owner());
|
|
320
480
|
}
|
|
321
481
|
|
|
322
|
-
getActiveAttesterCount() {
|
|
323
|
-
return this.rollup.read.getActiveAttesterCount();
|
|
482
|
+
async getActiveAttesterCount(): Promise<number> {
|
|
483
|
+
return Number(await this.rollup.read.getActiveAttesterCount());
|
|
324
484
|
}
|
|
325
485
|
|
|
326
486
|
public async getSlashingProposerAddress() {
|
|
@@ -331,31 +491,35 @@ export class RollupContract {
|
|
|
331
491
|
return await slasher.getProposer();
|
|
332
492
|
}
|
|
333
493
|
|
|
334
|
-
|
|
335
|
-
return this.rollup.read.
|
|
494
|
+
getCheckpointReward(): Promise<bigint> {
|
|
495
|
+
return this.rollup.read.getCheckpointReward();
|
|
336
496
|
}
|
|
337
497
|
|
|
338
|
-
|
|
339
|
-
return this.rollup.read.
|
|
498
|
+
async getCheckpointNumber(): Promise<CheckpointNumber> {
|
|
499
|
+
return CheckpointNumber.fromBigInt(await this.rollup.read.getPendingCheckpointNumber());
|
|
340
500
|
}
|
|
341
501
|
|
|
342
|
-
|
|
343
|
-
return this.rollup.read.
|
|
502
|
+
async getProvenCheckpointNumber(): Promise<CheckpointNumber> {
|
|
503
|
+
return CheckpointNumber.fromBigInt(await this.rollup.read.getProvenCheckpointNumber());
|
|
344
504
|
}
|
|
345
505
|
|
|
346
|
-
getSlotNumber() {
|
|
347
|
-
return this.rollup.read.getCurrentSlot();
|
|
506
|
+
async getSlotNumber(): Promise<SlotNumber> {
|
|
507
|
+
return SlotNumber.fromBigInt(await this.rollup.read.getCurrentSlot());
|
|
348
508
|
}
|
|
349
509
|
|
|
350
|
-
getL1FeesAt(timestamp: bigint) {
|
|
351
|
-
|
|
510
|
+
async getL1FeesAt(timestamp: bigint): Promise<L1FeeData> {
|
|
511
|
+
const result = await this.rollup.read.getL1FeesAt([timestamp]);
|
|
512
|
+
return {
|
|
513
|
+
baseFee: result.baseFee,
|
|
514
|
+
blobFee: result.blobFee,
|
|
515
|
+
};
|
|
352
516
|
}
|
|
353
517
|
|
|
354
|
-
|
|
355
|
-
return this.rollup.read.
|
|
518
|
+
getEthPerFeeAsset(): Promise<bigint> {
|
|
519
|
+
return this.rollup.read.getEthPerFeeAsset();
|
|
356
520
|
}
|
|
357
521
|
|
|
358
|
-
async getCommitteeAt(timestamp: bigint): Promise<
|
|
522
|
+
async getCommitteeAt(timestamp: bigint): Promise<EthAddress[] | undefined> {
|
|
359
523
|
const { result } = await this.client
|
|
360
524
|
.simulateContract({
|
|
361
525
|
address: this.address,
|
|
@@ -370,22 +534,22 @@ export class RollupContract {
|
|
|
370
534
|
throw e;
|
|
371
535
|
});
|
|
372
536
|
|
|
373
|
-
return result;
|
|
537
|
+
return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
|
|
374
538
|
}
|
|
375
539
|
|
|
376
|
-
getSampleSeedAt(timestamp: bigint) {
|
|
377
|
-
return this.rollup.read.getSampleSeedAt([timestamp]);
|
|
540
|
+
async getSampleSeedAt(timestamp: bigint): Promise<Buffer32> {
|
|
541
|
+
return Buffer32.fromBigInt(await this.rollup.read.getSampleSeedAt([timestamp]));
|
|
378
542
|
}
|
|
379
543
|
|
|
380
|
-
getCurrentSampleSeed() {
|
|
381
|
-
return this.rollup.read.getCurrentSampleSeed();
|
|
544
|
+
async getCurrentSampleSeed(): Promise<Buffer32> {
|
|
545
|
+
return Buffer32.fromBigInt(await this.rollup.read.getCurrentSampleSeed());
|
|
382
546
|
}
|
|
383
547
|
|
|
384
|
-
getCurrentEpoch() {
|
|
385
|
-
return this.rollup.read.getCurrentEpoch();
|
|
548
|
+
async getCurrentEpoch(): Promise<EpochNumber> {
|
|
549
|
+
return EpochNumber.fromBigInt(await this.rollup.read.getCurrentEpoch());
|
|
386
550
|
}
|
|
387
551
|
|
|
388
|
-
async getCurrentEpochCommittee(): Promise<
|
|
552
|
+
async getCurrentEpochCommittee(): Promise<EthAddress[] | undefined> {
|
|
389
553
|
const { result } = await this.client
|
|
390
554
|
.simulateContract({
|
|
391
555
|
address: this.address,
|
|
@@ -400,10 +564,10 @@ export class RollupContract {
|
|
|
400
564
|
throw e;
|
|
401
565
|
});
|
|
402
566
|
|
|
403
|
-
return result;
|
|
567
|
+
return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
|
|
404
568
|
}
|
|
405
569
|
|
|
406
|
-
async getCurrentProposer() {
|
|
570
|
+
async getCurrentProposer(): Promise<EthAddress> {
|
|
407
571
|
const { result } = await this.client.simulateContract({
|
|
408
572
|
address: this.address,
|
|
409
573
|
abi: RollupAbi,
|
|
@@ -411,10 +575,10 @@ export class RollupContract {
|
|
|
411
575
|
args: [],
|
|
412
576
|
});
|
|
413
577
|
|
|
414
|
-
return result;
|
|
578
|
+
return EthAddress.fromString(result);
|
|
415
579
|
}
|
|
416
580
|
|
|
417
|
-
async getProposerAt(timestamp: bigint) {
|
|
581
|
+
async getProposerAt(timestamp: bigint): Promise<EthAddress> {
|
|
418
582
|
const { result } = await this.client.simulateContract({
|
|
419
583
|
address: this.address,
|
|
420
584
|
abi: RollupAbi,
|
|
@@ -422,39 +586,73 @@ export class RollupContract {
|
|
|
422
586
|
args: [timestamp],
|
|
423
587
|
});
|
|
424
588
|
|
|
425
|
-
return result;
|
|
589
|
+
return EthAddress.fromString(result);
|
|
426
590
|
}
|
|
427
591
|
|
|
428
|
-
|
|
429
|
-
|
|
592
|
+
async getCheckpoint(checkpointNumber: CheckpointNumber): Promise<CheckpointLog> {
|
|
593
|
+
const result = await this.rollup.read.getCheckpoint([BigInt(checkpointNumber)]);
|
|
594
|
+
return {
|
|
595
|
+
archive: Fr.fromString(result.archive),
|
|
596
|
+
headerHash: Buffer32.fromString(result.headerHash),
|
|
597
|
+
blobCommitmentsHash: Buffer32.fromString(result.blobCommitmentsHash),
|
|
598
|
+
attestationsHash: Buffer32.fromString(result.attestationsHash),
|
|
599
|
+
payloadDigest: Buffer32.fromString(result.payloadDigest),
|
|
600
|
+
slotNumber: SlotNumber.fromBigInt(result.slotNumber),
|
|
601
|
+
feeHeader: {
|
|
602
|
+
excessMana: result.feeHeader.excessMana,
|
|
603
|
+
manaUsed: result.feeHeader.manaUsed,
|
|
604
|
+
ethPerFeeAsset: result.feeHeader.ethPerFeeAsset,
|
|
605
|
+
congestionCost: result.feeHeader.congestionCost,
|
|
606
|
+
proverCost: result.feeHeader.proverCost,
|
|
607
|
+
},
|
|
608
|
+
};
|
|
430
609
|
}
|
|
431
610
|
|
|
432
|
-
|
|
433
|
-
|
|
611
|
+
/** Returns the pending checkpoint from the rollup contract */
|
|
612
|
+
getPendingCheckpoint() {
|
|
613
|
+
// We retry because of race conditions during prunes: we may get a pending checkpoint number which is immediately
|
|
614
|
+
// reorged out due to a prune happening, causing the subsequent getCheckpoint call to fail. So we try again in that case.
|
|
615
|
+
return retry(
|
|
616
|
+
async () => {
|
|
617
|
+
const pendingCheckpointNumber = await this.getCheckpointNumber();
|
|
618
|
+
const pendingCheckpoint = await this.getCheckpoint(pendingCheckpointNumber);
|
|
619
|
+
return pendingCheckpoint;
|
|
620
|
+
},
|
|
621
|
+
'getting pending checkpoint',
|
|
622
|
+
makeBackoff([0.5, 0.5, 0.5]),
|
|
623
|
+
);
|
|
434
624
|
}
|
|
435
625
|
|
|
436
|
-
|
|
437
|
-
|
|
626
|
+
async getTips(): Promise<{ pending: CheckpointNumber; proven: CheckpointNumber }> {
|
|
627
|
+
const { pending, proven } = await this.rollup.read.getTips();
|
|
628
|
+
return {
|
|
629
|
+
pending: CheckpointNumber.fromBigInt(pending),
|
|
630
|
+
proven: CheckpointNumber.fromBigInt(proven),
|
|
631
|
+
};
|
|
438
632
|
}
|
|
439
633
|
|
|
440
|
-
|
|
441
|
-
return this.rollup.read.
|
|
634
|
+
getTimestampForSlot(slot: SlotNumber): Promise<bigint> {
|
|
635
|
+
return this.rollup.read.getTimestampForSlot([BigInt(slot)]);
|
|
442
636
|
}
|
|
443
637
|
|
|
444
|
-
|
|
445
|
-
return this.rollup.read.
|
|
638
|
+
async getEntryQueueLength(): Promise<number> {
|
|
639
|
+
return Number(await this.rollup.read.getEntryQueueLength());
|
|
446
640
|
}
|
|
447
641
|
|
|
448
|
-
|
|
449
|
-
return this.rollup.read.
|
|
642
|
+
async getAvailableValidatorFlushes(): Promise<number> {
|
|
643
|
+
return Number(await this.rollup.read.getAvailableValidatorFlushes());
|
|
450
644
|
}
|
|
451
645
|
|
|
452
|
-
|
|
453
|
-
return this.rollup.read.
|
|
646
|
+
async getNextFlushableEpoch(): Promise<EpochNumber> {
|
|
647
|
+
return EpochNumber.fromBigInt(await this.rollup.read.getNextFlushableEpoch());
|
|
454
648
|
}
|
|
455
649
|
|
|
456
|
-
|
|
457
|
-
return this.rollup.read.
|
|
650
|
+
async getCurrentEpochNumber(): Promise<EpochNumber> {
|
|
651
|
+
return EpochNumber.fromBigInt(await this.rollup.read.getCurrentEpoch());
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
async getEpochNumberForCheckpoint(checkpointNumber: CheckpointNumber): Promise<EpochNumber> {
|
|
655
|
+
return EpochNumber.fromBigInt(await this.rollup.read.getEpochForCheckpoint([BigInt(checkpointNumber)]));
|
|
458
656
|
}
|
|
459
657
|
|
|
460
658
|
async getRollupAddresses(): Promise<L1RollupContractAddresses> {
|
|
@@ -494,14 +692,15 @@ export class RollupContract {
|
|
|
494
692
|
return EthAddress.fromString(await this.rollup.read.getFeeAssetPortal());
|
|
495
693
|
}
|
|
496
694
|
|
|
497
|
-
public async getEpochNumberForSlotNumber(slotNumber:
|
|
498
|
-
return await this.rollup.read.getEpochAtSlot([slotNumber]);
|
|
695
|
+
public async getEpochNumberForSlotNumber(slotNumber: SlotNumber): Promise<EpochNumber> {
|
|
696
|
+
return EpochNumber.fromBigInt(await this.rollup.read.getEpochAtSlot([BigInt(slotNumber)]));
|
|
499
697
|
}
|
|
500
698
|
|
|
501
|
-
getEpochProofPublicInputs(
|
|
699
|
+
async getEpochProofPublicInputs(
|
|
502
700
|
args: readonly [bigint, bigint, EpochProofPublicInputArgs, readonly `0x${string}`[], `0x${string}`],
|
|
503
|
-
) {
|
|
504
|
-
|
|
701
|
+
): Promise<Fr[]> {
|
|
702
|
+
const result = await this.rollup.read.getEpochProofPublicInputs(args);
|
|
703
|
+
return result.map(Fr.fromString);
|
|
505
704
|
}
|
|
506
705
|
|
|
507
706
|
public async validateHeader(
|
|
@@ -538,53 +737,57 @@ export class RollupContract {
|
|
|
538
737
|
* @dev Throws if unable to propose
|
|
539
738
|
*
|
|
540
739
|
* @param archive - The archive that we expect to be current state
|
|
541
|
-
* @return [slot,
|
|
740
|
+
* @return [slot, checkpointNumber, timeOfNextL1Slot] - If you can propose, the L2 slot number, checkpoint number and
|
|
741
|
+
* timestamp of the next L1 block
|
|
542
742
|
* @throws otherwise
|
|
543
743
|
*/
|
|
544
744
|
public async canProposeAtNextEthBlock(
|
|
545
745
|
archive: Buffer,
|
|
546
746
|
account: `0x${string}` | Account,
|
|
547
|
-
slotDuration:
|
|
548
|
-
opts: {
|
|
549
|
-
): Promise<{ slot:
|
|
550
|
-
if (typeof slotDuration === 'number') {
|
|
551
|
-
slotDuration = BigInt(slotDuration);
|
|
552
|
-
}
|
|
747
|
+
slotDuration: number,
|
|
748
|
+
opts: { forcePendingCheckpointNumber?: CheckpointNumber } = {},
|
|
749
|
+
): Promise<{ slot: SlotNumber; checkpointNumber: CheckpointNumber; timeOfNextL1Slot: bigint }> {
|
|
553
750
|
const latestBlock = await this.client.getBlock();
|
|
554
|
-
const timeOfNextL1Slot = latestBlock.timestamp + slotDuration;
|
|
751
|
+
const timeOfNextL1Slot = latestBlock.timestamp + BigInt(slotDuration);
|
|
555
752
|
const who = typeof account === 'string' ? account : account.address;
|
|
556
753
|
|
|
557
754
|
try {
|
|
558
755
|
const {
|
|
559
|
-
result: [slot,
|
|
756
|
+
result: [slot, checkpointNumber],
|
|
560
757
|
} = await this.client.simulateContract({
|
|
561
758
|
address: this.address,
|
|
562
759
|
abi: RollupAbi,
|
|
563
760
|
functionName: 'canProposeAtTime',
|
|
564
761
|
args: [timeOfNextL1Slot, `0x${archive.toString('hex')}`, who],
|
|
565
762
|
account,
|
|
566
|
-
stateOverride: await this.
|
|
763
|
+
stateOverride: await this.makePendingCheckpointNumberOverride(opts.forcePendingCheckpointNumber),
|
|
567
764
|
});
|
|
568
765
|
|
|
569
|
-
return {
|
|
766
|
+
return {
|
|
767
|
+
slot: SlotNumber.fromBigInt(slot),
|
|
768
|
+
checkpointNumber: CheckpointNumber.fromBigInt(checkpointNumber),
|
|
769
|
+
timeOfNextL1Slot,
|
|
770
|
+
};
|
|
570
771
|
} catch (err: unknown) {
|
|
571
772
|
throw formatViemError(err);
|
|
572
773
|
}
|
|
573
774
|
}
|
|
574
775
|
|
|
575
776
|
/**
|
|
576
|
-
* Returns a state override that sets the pending
|
|
577
|
-
* Requires querying the current state of the contract to get the current proven
|
|
777
|
+
* Returns a state override that sets the pending checkpoint number to the specified value. Useful for simulations.
|
|
778
|
+
* Requires querying the current state of the contract to get the current proven checkpoint number, as they are both
|
|
578
779
|
* stored in the same slot. If the argument is undefined, it returns an empty override.
|
|
579
780
|
*/
|
|
580
|
-
public async
|
|
581
|
-
|
|
781
|
+
public async makePendingCheckpointNumberOverride(
|
|
782
|
+
forcePendingCheckpointNumber: CheckpointNumber | undefined,
|
|
783
|
+
): Promise<StateOverride> {
|
|
784
|
+
if (forcePendingCheckpointNumber === undefined) {
|
|
582
785
|
return [];
|
|
583
786
|
}
|
|
584
787
|
const slot = RollupContract.stfStorageSlot;
|
|
585
788
|
const currentValue = await this.client.getStorageAt({ address: this.address, slot });
|
|
586
|
-
const
|
|
587
|
-
const newValue = (BigInt(
|
|
789
|
+
const currentProvenCheckpointNumber = currentValue ? hexToBigInt(currentValue) & ((1n << 128n) - 1n) : 0n;
|
|
790
|
+
const newValue = (BigInt(forcePendingCheckpointNumber) << 128n) | currentProvenCheckpointNumber;
|
|
588
791
|
return [
|
|
589
792
|
{
|
|
590
793
|
address: this.address,
|
|
@@ -595,18 +798,19 @@ export class RollupContract {
|
|
|
595
798
|
|
|
596
799
|
/** Creates a request to Rollup#invalidateBadAttestation to be simulated or sent */
|
|
597
800
|
public buildInvalidateBadAttestationRequest(
|
|
598
|
-
|
|
801
|
+
checkpointNumber: CheckpointNumber,
|
|
599
802
|
attestationsAndSigners: ViemCommitteeAttestations,
|
|
600
803
|
committee: EthAddress[],
|
|
601
804
|
invalidIndex: number,
|
|
602
805
|
): L1TxRequest {
|
|
603
806
|
return {
|
|
604
807
|
to: this.address,
|
|
808
|
+
abi: RollupAbi,
|
|
605
809
|
data: encodeFunctionData({
|
|
606
810
|
abi: RollupAbi,
|
|
607
811
|
functionName: 'invalidateBadAttestation',
|
|
608
812
|
args: [
|
|
609
|
-
BigInt(
|
|
813
|
+
BigInt(checkpointNumber),
|
|
610
814
|
attestationsAndSigners,
|
|
611
815
|
committee.map(addr => addr.toString()),
|
|
612
816
|
BigInt(invalidIndex),
|
|
@@ -617,112 +821,147 @@ export class RollupContract {
|
|
|
617
821
|
|
|
618
822
|
/** Creates a request to Rollup#invalidateInsufficientAttestations to be simulated or sent */
|
|
619
823
|
public buildInvalidateInsufficientAttestationsRequest(
|
|
620
|
-
|
|
824
|
+
checkpointNumber: CheckpointNumber,
|
|
621
825
|
attestationsAndSigners: ViemCommitteeAttestations,
|
|
622
826
|
committee: EthAddress[],
|
|
623
827
|
): L1TxRequest {
|
|
624
828
|
return {
|
|
625
829
|
to: this.address,
|
|
830
|
+
abi: RollupAbi,
|
|
626
831
|
data: encodeFunctionData({
|
|
627
832
|
abi: RollupAbi,
|
|
628
833
|
functionName: 'invalidateInsufficientAttestations',
|
|
629
|
-
args: [BigInt(
|
|
834
|
+
args: [BigInt(checkpointNumber), attestationsAndSigners, committee.map(addr => addr.toString())],
|
|
630
835
|
}),
|
|
631
836
|
};
|
|
632
837
|
}
|
|
633
838
|
|
|
634
839
|
/** Calls getHasSubmitted directly. Returns whether the given prover has submitted a proof with the given length for the given epoch. */
|
|
635
|
-
public getHasSubmittedProof(epochNumber:
|
|
840
|
+
public getHasSubmittedProof(epochNumber: EpochNumber, numberOfCheckpointsInEpoch: number, prover: Hex | EthAddress) {
|
|
636
841
|
if (prover instanceof EthAddress) {
|
|
637
842
|
prover = prover.toString();
|
|
638
843
|
}
|
|
639
|
-
return this.rollup.read.getHasSubmitted([BigInt(epochNumber), BigInt(
|
|
844
|
+
return this.rollup.read.getHasSubmitted([BigInt(epochNumber), BigInt(numberOfCheckpointsInEpoch), prover]);
|
|
640
845
|
}
|
|
641
846
|
|
|
642
|
-
|
|
643
|
-
return this.rollup.read.
|
|
847
|
+
getManaMinFeeAt(timestamp: bigint, inFeeAsset: boolean): Promise<bigint> {
|
|
848
|
+
return this.rollup.read.getManaMinFeeAt([timestamp, inFeeAsset]);
|
|
644
849
|
}
|
|
645
850
|
|
|
646
|
-
getSlotAt(timestamp: bigint) {
|
|
647
|
-
return this.rollup.read.getSlotAt([timestamp]);
|
|
851
|
+
async getSlotAt(timestamp: bigint): Promise<SlotNumber> {
|
|
852
|
+
return SlotNumber.fromBigInt(await this.rollup.read.getSlotAt([timestamp]));
|
|
648
853
|
}
|
|
649
854
|
|
|
650
|
-
async status(
|
|
855
|
+
async status(checkpointNumber: CheckpointNumber, options?: { blockNumber?: bigint }): Promise<RollupStatusResponse> {
|
|
651
856
|
await checkBlockTag(options?.blockNumber, this.client);
|
|
652
|
-
|
|
857
|
+
const result = await this.rollup.read.status([BigInt(checkpointNumber)], options);
|
|
858
|
+
return {
|
|
859
|
+
provenCheckpointNumber: CheckpointNumber.fromBigInt(result[0]),
|
|
860
|
+
provenArchive: Fr.fromString(result[1]),
|
|
861
|
+
pendingCheckpointNumber: CheckpointNumber.fromBigInt(result[2]),
|
|
862
|
+
pendingArchive: Fr.fromString(result[3]),
|
|
863
|
+
archiveOfMyCheckpoint: Fr.fromString(result[4]),
|
|
864
|
+
};
|
|
653
865
|
}
|
|
654
866
|
|
|
655
|
-
async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }) {
|
|
867
|
+
async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }): Promise<boolean> {
|
|
656
868
|
await checkBlockTag(options?.blockNumber, this.client);
|
|
657
869
|
return this.rollup.read.canPruneAtTime([timestamp], options);
|
|
658
870
|
}
|
|
659
871
|
|
|
660
|
-
archive() {
|
|
661
|
-
return this.rollup.read.archive();
|
|
872
|
+
async archive(): Promise<Fr> {
|
|
873
|
+
return Fr.fromString(await this.rollup.read.archive());
|
|
662
874
|
}
|
|
663
875
|
|
|
664
|
-
archiveAt(
|
|
665
|
-
return this.rollup.read.archiveAt([
|
|
876
|
+
async archiveAt(checkpointNumber: CheckpointNumber): Promise<Fr> {
|
|
877
|
+
return Fr.fromString(await this.rollup.read.archiveAt([BigInt(checkpointNumber)]));
|
|
666
878
|
}
|
|
667
879
|
|
|
668
|
-
getSequencerRewards(address: Hex | EthAddress) {
|
|
880
|
+
getSequencerRewards(address: Hex | EthAddress): Promise<bigint> {
|
|
669
881
|
if (address instanceof EthAddress) {
|
|
670
882
|
address = address.toString();
|
|
671
883
|
}
|
|
672
884
|
return this.rollup.read.getSequencerRewards([address]);
|
|
673
885
|
}
|
|
674
886
|
|
|
675
|
-
getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress) {
|
|
887
|
+
getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress): Promise<bigint> {
|
|
676
888
|
if (prover instanceof EthAddress) {
|
|
677
889
|
prover = prover.toString();
|
|
678
890
|
}
|
|
679
891
|
return this.rollup.read.getSpecificProverRewardsForEpoch([epoch, prover]);
|
|
680
892
|
}
|
|
681
893
|
|
|
682
|
-
async getAttesters() {
|
|
894
|
+
async getAttesters(): Promise<EthAddress[]> {
|
|
683
895
|
const attesterSize = await this.getActiveAttesterCount();
|
|
684
896
|
const gse = new GSEContract(this.client, await this.getGSE());
|
|
685
897
|
const ts = (await this.client.getBlock()).timestamp;
|
|
686
898
|
|
|
687
|
-
const indices = Array.from({ length:
|
|
899
|
+
const indices = Array.from({ length: attesterSize }, (_, i) => BigInt(i));
|
|
688
900
|
const chunks = chunk(indices, 1000);
|
|
689
901
|
|
|
690
|
-
|
|
902
|
+
const results = await Promise.all(chunks.map(chunk => gse.getAttestersFromIndicesAtTime(this.address, ts, chunk)));
|
|
903
|
+
return results.flat().map(addr => EthAddress.fromString(addr));
|
|
691
904
|
}
|
|
692
905
|
|
|
693
|
-
getAttesterView(address: Hex | EthAddress) {
|
|
906
|
+
async getAttesterView(address: Hex | EthAddress): Promise<AttesterView> {
|
|
694
907
|
if (address instanceof EthAddress) {
|
|
695
908
|
address = address.toString();
|
|
696
909
|
}
|
|
697
|
-
|
|
910
|
+
const result = await this.rollup.read.getAttesterView([address]);
|
|
911
|
+
return {
|
|
912
|
+
status: result.status as AttesterStatus,
|
|
913
|
+
effectiveBalance: result.effectiveBalance,
|
|
914
|
+
exit: {
|
|
915
|
+
withdrawalId: result.exit.withdrawalId,
|
|
916
|
+
amount: result.exit.amount,
|
|
917
|
+
exitableAt: result.exit.exitableAt,
|
|
918
|
+
recipientOrWithdrawer: EthAddress.fromString(result.exit.recipientOrWithdrawer),
|
|
919
|
+
isRecipient: result.exit.isRecipient,
|
|
920
|
+
exists: result.exit.exists,
|
|
921
|
+
},
|
|
922
|
+
config: {
|
|
923
|
+
publicKey: {
|
|
924
|
+
x: result.config.publicKey.x,
|
|
925
|
+
y: result.config.publicKey.y,
|
|
926
|
+
},
|
|
927
|
+
withdrawer: EthAddress.fromString(result.config.withdrawer),
|
|
928
|
+
},
|
|
929
|
+
};
|
|
698
930
|
}
|
|
699
931
|
|
|
700
|
-
getStatus(address: Hex | EthAddress) {
|
|
932
|
+
async getStatus(address: Hex | EthAddress): Promise<AttesterStatus> {
|
|
701
933
|
if (address instanceof EthAddress) {
|
|
702
934
|
address = address.toString();
|
|
703
935
|
}
|
|
704
|
-
return this.rollup.read.getStatus([address]);
|
|
936
|
+
return (await this.rollup.read.getStatus([address])) as AttesterStatus;
|
|
705
937
|
}
|
|
706
938
|
|
|
707
|
-
getBlobCommitmentsHash(
|
|
708
|
-
return this.rollup.read.getBlobCommitmentsHash([
|
|
939
|
+
async getBlobCommitmentsHash(checkpointNumber: CheckpointNumber): Promise<Buffer32> {
|
|
940
|
+
return Buffer32.fromString(await this.rollup.read.getBlobCommitmentsHash([BigInt(checkpointNumber)]));
|
|
709
941
|
}
|
|
710
942
|
|
|
711
|
-
getCurrentBlobCommitmentsHash() {
|
|
712
|
-
return this.rollup.read.getCurrentBlobCommitmentsHash();
|
|
943
|
+
async getCurrentBlobCommitmentsHash(): Promise<Buffer32> {
|
|
944
|
+
return Buffer32.fromString(await this.rollup.read.getCurrentBlobCommitmentsHash());
|
|
713
945
|
}
|
|
714
946
|
|
|
715
|
-
getStakingAsset() {
|
|
716
|
-
return this.rollup.read.getStakingAsset();
|
|
947
|
+
async getStakingAsset(): Promise<EthAddress> {
|
|
948
|
+
return EthAddress.fromString(await this.rollup.read.getStakingAsset());
|
|
717
949
|
}
|
|
718
950
|
|
|
719
|
-
getRewardConfig() {
|
|
720
|
-
|
|
951
|
+
async getRewardConfig(): Promise<RewardConfig> {
|
|
952
|
+
const result = await this.rollup.read.getRewardConfig();
|
|
953
|
+
return {
|
|
954
|
+
rewardDistributor: EthAddress.fromString(result.rewardDistributor),
|
|
955
|
+
sequencerBps: BigInt(result.sequencerBps),
|
|
956
|
+
booster: EthAddress.fromString(result.booster),
|
|
957
|
+
checkpointReward: result.checkpointReward,
|
|
958
|
+
};
|
|
721
959
|
}
|
|
722
960
|
|
|
723
961
|
setupEpoch(l1TxUtils: L1TxUtils) {
|
|
724
962
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
725
963
|
to: this.address,
|
|
964
|
+
abi: RollupAbi,
|
|
726
965
|
data: encodeFunctionData({
|
|
727
966
|
abi: RollupAbi,
|
|
728
967
|
functionName: 'setupEpoch',
|
|
@@ -734,6 +973,7 @@ export class RollupContract {
|
|
|
734
973
|
vote(l1TxUtils: L1TxUtils, proposalId: bigint) {
|
|
735
974
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
736
975
|
to: this.address,
|
|
976
|
+
abi: RollupAbi,
|
|
737
977
|
data: encodeFunctionData({
|
|
738
978
|
abi: RollupAbi,
|
|
739
979
|
functionName: 'vote',
|
|
@@ -760,15 +1000,17 @@ export class RollupContract {
|
|
|
760
1000
|
);
|
|
761
1001
|
}
|
|
762
1002
|
|
|
763
|
-
public
|
|
764
|
-
|
|
1003
|
+
public listenToCheckpointInvalidated(
|
|
1004
|
+
callback: (args: { checkpointNumber: CheckpointNumber }) => unknown,
|
|
1005
|
+
): WatchContractEventReturnType {
|
|
1006
|
+
return this.rollup.watchEvent.CheckpointInvalidated(
|
|
765
1007
|
{},
|
|
766
1008
|
{
|
|
767
1009
|
onLogs: logs => {
|
|
768
1010
|
for (const log of logs) {
|
|
769
1011
|
const args = log.args;
|
|
770
|
-
if (args.
|
|
771
|
-
callback({
|
|
1012
|
+
if (args.checkpointNumber !== undefined) {
|
|
1013
|
+
callback({ checkpointNumber: CheckpointNumber.fromBigInt(args.checkpointNumber) });
|
|
772
1014
|
}
|
|
773
1015
|
}
|
|
774
1016
|
},
|
|
@@ -800,4 +1042,23 @@ export class RollupContract {
|
|
|
800
1042
|
},
|
|
801
1043
|
);
|
|
802
1044
|
}
|
|
1045
|
+
|
|
1046
|
+
/** Fetches CheckpointProposed events within the given block range. */
|
|
1047
|
+
async getCheckpointProposedEvents(fromBlock: bigint, toBlock: bigint): Promise<CheckpointProposedLog[]> {
|
|
1048
|
+
const logs = await this.rollup.getEvents.CheckpointProposed({}, { fromBlock, toBlock });
|
|
1049
|
+
return logs
|
|
1050
|
+
.filter(log => log.blockNumber! >= fromBlock && log.blockNumber! <= toBlock)
|
|
1051
|
+
.map(log => ({
|
|
1052
|
+
l1BlockNumber: log.blockNumber!,
|
|
1053
|
+
l1BlockHash: Buffer32.fromString(log.blockHash!),
|
|
1054
|
+
l1TransactionHash: log.transactionHash!,
|
|
1055
|
+
args: {
|
|
1056
|
+
checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber!),
|
|
1057
|
+
archive: Fr.fromString(log.args.archive!),
|
|
1058
|
+
versionedBlobHashes: log.args.versionedBlobHashes!.map(h => Buffer.from(h.slice(2), 'hex')),
|
|
1059
|
+
attestationsHash: log.args.attestationsHash ? Buffer32.fromString(log.args.attestationsHash) : undefined,
|
|
1060
|
+
payloadDigest: log.args.payloadDigest ? Buffer32.fromString(log.args.payloadDigest) : undefined,
|
|
1061
|
+
},
|
|
1062
|
+
}));
|
|
1063
|
+
}
|
|
803
1064
|
}
|