@aztec/ethereum 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/config.d.ts +15 -28
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +46 -55
- 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 +9 -9
- package/dest/contracts/governance.d.ts +3 -1
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +9 -1
- package/dest/contracts/governance_proposer.js +382 -8
- package/dest/contracts/inbox.d.ts +18 -1
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +32 -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/outbox.d.ts +41 -0
- package/dest/contracts/outbox.d.ts.map +1 -0
- package/dest/contracts/outbox.js +86 -0
- package/dest/contracts/rollup.d.ts +160 -96
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +668 -129
- package/dest/deploy_aztec_l1_contracts.d.ts +15 -2
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +74 -12
- 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 +4866 -1513
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_tx_utils/fee-strategies/index.d.ts +3 -2
- package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -1
- package/dest/l1_tx_utils/fee-strategies/index.js +2 -1
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +2 -12
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -1
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +35 -17
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +2 -11
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -1
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +36 -18
- package/dest/l1_tx_utils/fee-strategies/types.d.ts +14 -27
- package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -1
- package/dest/l1_tx_utils/fee-strategies/types.js +0 -21
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +2 -2
- package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_fee_analyzer.js +3 -3
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -5
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +14 -51
- package/dest/queries.d.ts +2 -2
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +6 -3
- package/dest/test/chain_monitor.js +1 -2
- package/dest/test/eth_cheat_codes.d.ts +13 -1
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.d.ts +3 -2
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +10 -2
- package/package.json +8 -7
- package/src/config.ts +55 -54
- package/src/contracts/README.md +157 -0
- package/src/contracts/fee_asset_handler.ts +8 -7
- package/src/contracts/governance.ts +8 -1
- package/src/contracts/inbox.ts +48 -1
- package/src/contracts/index.ts +2 -0
- package/src/contracts/log.ts +13 -0
- package/src/contracts/outbox.ts +98 -0
- package/src/contracts/rollup.ts +333 -93
- package/src/deploy_aztec_l1_contracts.ts +76 -14
- package/src/generated/l1-contracts-defaults.ts +32 -0
- package/src/l1_tx_utils/fee-strategies/index.ts +1 -1
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +45 -41
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +48 -44
- package/src/l1_tx_utils/fee-strategies/types.ts +14 -46
- package/src/l1_tx_utils/l1_fee_analyzer.ts +2 -3
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +20 -59
- package/src/queries.ts +5 -3
- package/src/test/chain_monitor.ts +1 -1
- package/src/test/rollup_cheat_codes.ts +12 -3
package/src/contracts/rollup.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
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';
|
|
2
4
|
import { memoize } from '@aztec/foundation/decorators';
|
|
3
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
6
|
import type { ViemSignature } from '@aztec/foundation/eth-signature';
|
|
5
7
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
8
|
+
import { EscapeHatchAbi } from '@aztec/l1-artifacts/EscapeHatchAbi';
|
|
6
9
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
7
10
|
import { RollupStorage } from '@aztec/l1-artifacts/RollupStorage';
|
|
8
11
|
|
|
@@ -28,6 +31,7 @@ import type { ViemClient } from '../types.js';
|
|
|
28
31
|
import { formatViemError } from '../utils.js';
|
|
29
32
|
import { EmpireSlashingProposerContract } from './empire_slashing_proposer.js';
|
|
30
33
|
import { GSEContract } from './gse.js';
|
|
34
|
+
import type { L1EventLog } from './log.js';
|
|
31
35
|
import { SlasherContract } from './slasher_contract.js';
|
|
32
36
|
import { TallySlashingProposerContract } from './tally_slashing_proposer.js';
|
|
33
37
|
import { checkBlockTag } from './utils.js';
|
|
@@ -58,13 +62,16 @@ export type L1RollupContractAddresses = Pick<
|
|
|
58
62
|
export type EpochProofPublicInputArgs = {
|
|
59
63
|
previousArchive: `0x${string}`;
|
|
60
64
|
endArchive: `0x${string}`;
|
|
65
|
+
outHash: `0x${string}`;
|
|
61
66
|
proverId: `0x${string}`;
|
|
62
67
|
};
|
|
63
68
|
|
|
64
69
|
export type ViemHeader = {
|
|
65
70
|
lastArchiveRoot: `0x${string}`;
|
|
66
71
|
blockHeadersHash: `0x${string}`;
|
|
67
|
-
|
|
72
|
+
blobsHash: `0x${string}`;
|
|
73
|
+
inHash: `0x${string}`;
|
|
74
|
+
outHash: `0x${string}`;
|
|
68
75
|
slotNumber: bigint;
|
|
69
76
|
timestamp: bigint;
|
|
70
77
|
coinbase: `0x${string}`;
|
|
@@ -73,12 +80,6 @@ export type ViemHeader = {
|
|
|
73
80
|
totalManaUsed: bigint;
|
|
74
81
|
};
|
|
75
82
|
|
|
76
|
-
export type ViemContentCommitment = {
|
|
77
|
-
blobsHash: `0x${string}`;
|
|
78
|
-
inHash: `0x${string}`;
|
|
79
|
-
outHash: `0x${string}`;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
83
|
export type ViemGasFees = {
|
|
83
84
|
feePerDaGas: bigint;
|
|
84
85
|
feePerL2Gas: bigint;
|
|
@@ -90,10 +91,125 @@ export enum SlashingProposerType {
|
|
|
90
91
|
Empire = 2,
|
|
91
92
|
}
|
|
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;
|
|
114
|
+
};
|
|
115
|
+
|
|
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;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* L1 fee data (base fee and blob fee)
|
|
131
|
+
*/
|
|
132
|
+
export type L1FeeData = {
|
|
133
|
+
baseFee: bigint;
|
|
134
|
+
blobFee: bigint;
|
|
135
|
+
};
|
|
136
|
+
|
|
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>;
|
|
204
|
+
|
|
93
205
|
export class RollupContract {
|
|
94
206
|
private readonly rollup: GetContractReturnType<typeof RollupAbi, ViemClient>;
|
|
95
207
|
|
|
96
208
|
private static cachedStfStorageSlot: Hex | undefined;
|
|
209
|
+
private cachedEscapeHatch?: {
|
|
210
|
+
address: EthAddress;
|
|
211
|
+
contract: GetContractReturnType<typeof EscapeHatchAbi, ViemClient>;
|
|
212
|
+
};
|
|
97
213
|
|
|
98
214
|
static get checkBlobStorageSlot(): bigint {
|
|
99
215
|
const asString = RollupStorage.find(storage => storage.label === 'checkBlob')?.slot;
|
|
@@ -131,8 +247,8 @@ export class RollupContract {
|
|
|
131
247
|
this.rollup = getContract({ address, abi: RollupAbi, client });
|
|
132
248
|
}
|
|
133
249
|
|
|
134
|
-
getGSE() {
|
|
135
|
-
return this.rollup.read.getGSE();
|
|
250
|
+
async getGSE(): Promise<EthAddress> {
|
|
251
|
+
return EthAddress.fromString(await this.rollup.read.getGSE());
|
|
136
252
|
}
|
|
137
253
|
|
|
138
254
|
public get address() {
|
|
@@ -174,23 +290,23 @@ export class RollupContract {
|
|
|
174
290
|
}
|
|
175
291
|
|
|
176
292
|
@memoize
|
|
177
|
-
getL1StartBlock() {
|
|
293
|
+
getL1StartBlock(): Promise<bigint> {
|
|
178
294
|
return this.rollup.read.L1_BLOCK_AT_GENESIS();
|
|
179
295
|
}
|
|
180
296
|
|
|
181
297
|
@memoize
|
|
182
|
-
getL1GenesisTime() {
|
|
298
|
+
getL1GenesisTime(): Promise<bigint> {
|
|
183
299
|
return this.rollup.read.getGenesisTime();
|
|
184
300
|
}
|
|
185
301
|
|
|
186
302
|
@memoize
|
|
187
|
-
getProofSubmissionEpochs() {
|
|
188
|
-
return this.rollup.read.getProofSubmissionEpochs();
|
|
303
|
+
async getProofSubmissionEpochs(): Promise<number> {
|
|
304
|
+
return Number(await this.rollup.read.getProofSubmissionEpochs());
|
|
189
305
|
}
|
|
190
306
|
|
|
191
307
|
@memoize
|
|
192
|
-
getEpochDuration() {
|
|
193
|
-
return this.rollup.read.getEpochDuration();
|
|
308
|
+
async getEpochDuration(): Promise<number> {
|
|
309
|
+
return Number(await this.rollup.read.getEpochDuration());
|
|
194
310
|
}
|
|
195
311
|
|
|
196
312
|
@memoize
|
|
@@ -199,68 +315,68 @@ export class RollupContract {
|
|
|
199
315
|
}
|
|
200
316
|
|
|
201
317
|
@memoize
|
|
202
|
-
getTargetCommitteeSize() {
|
|
203
|
-
return this.rollup.read.getTargetCommitteeSize();
|
|
318
|
+
async getTargetCommitteeSize(): Promise<number> {
|
|
319
|
+
return Number(await this.rollup.read.getTargetCommitteeSize());
|
|
204
320
|
}
|
|
205
321
|
|
|
206
322
|
@memoize
|
|
207
|
-
getEjectionThreshold() {
|
|
323
|
+
getEjectionThreshold(): Promise<bigint> {
|
|
208
324
|
return this.rollup.read.getEjectionThreshold();
|
|
209
325
|
}
|
|
210
326
|
|
|
211
327
|
@memoize
|
|
212
|
-
getLocalEjectionThreshold() {
|
|
328
|
+
getLocalEjectionThreshold(): Promise<bigint> {
|
|
213
329
|
return this.rollup.read.getLocalEjectionThreshold();
|
|
214
330
|
}
|
|
215
331
|
|
|
216
332
|
@memoize
|
|
217
|
-
getLagInEpochsForValidatorSet() {
|
|
218
|
-
return this.rollup.read.getLagInEpochsForValidatorSet();
|
|
333
|
+
async getLagInEpochsForValidatorSet(): Promise<number> {
|
|
334
|
+
return Number(await this.rollup.read.getLagInEpochsForValidatorSet());
|
|
219
335
|
}
|
|
220
336
|
|
|
221
337
|
@memoize
|
|
222
|
-
getLagInEpochsForRandao() {
|
|
223
|
-
return this.rollup.read.getLagInEpochsForRandao();
|
|
338
|
+
async getLagInEpochsForRandao(): Promise<number> {
|
|
339
|
+
return Number(await this.rollup.read.getLagInEpochsForRandao());
|
|
224
340
|
}
|
|
225
341
|
|
|
226
342
|
@memoize
|
|
227
|
-
getActivationThreshold() {
|
|
343
|
+
getActivationThreshold(): Promise<bigint> {
|
|
228
344
|
return this.rollup.read.getActivationThreshold();
|
|
229
345
|
}
|
|
230
346
|
|
|
231
347
|
@memoize
|
|
232
|
-
getExitDelay() {
|
|
233
|
-
return this.rollup.read.getExitDelay();
|
|
348
|
+
async getExitDelay(): Promise<number> {
|
|
349
|
+
return Number(await this.rollup.read.getExitDelay());
|
|
234
350
|
}
|
|
235
351
|
|
|
236
352
|
@memoize
|
|
237
|
-
getManaTarget() {
|
|
353
|
+
getManaTarget(): Promise<bigint> {
|
|
238
354
|
return this.rollup.read.getManaTarget();
|
|
239
355
|
}
|
|
240
356
|
|
|
241
357
|
@memoize
|
|
242
|
-
getProvingCostPerMana() {
|
|
358
|
+
getProvingCostPerMana(): Promise<bigint> {
|
|
243
359
|
return this.rollup.read.getProvingCostPerManaInEth();
|
|
244
360
|
}
|
|
245
361
|
|
|
246
362
|
@memoize
|
|
247
|
-
getProvingCostPerManaInFeeAsset() {
|
|
363
|
+
getProvingCostPerManaInFeeAsset(): Promise<bigint> {
|
|
248
364
|
return this.rollup.read.getProvingCostPerManaInFeeAsset();
|
|
249
365
|
}
|
|
250
366
|
|
|
251
367
|
@memoize
|
|
252
|
-
getManaLimit() {
|
|
368
|
+
getManaLimit(): Promise<bigint> {
|
|
253
369
|
return this.rollup.read.getManaLimit();
|
|
254
370
|
}
|
|
255
371
|
|
|
256
372
|
@memoize
|
|
257
|
-
getVersion() {
|
|
373
|
+
getVersion(): Promise<bigint> {
|
|
258
374
|
return this.rollup.read.getVersion();
|
|
259
375
|
}
|
|
260
376
|
|
|
261
377
|
@memoize
|
|
262
|
-
async getGenesisArchiveTreeRoot(): Promise
|
|
263
|
-
return await this.rollup.read.archiveAt([0n]);
|
|
378
|
+
async getGenesisArchiveTreeRoot(): Promise<Fr> {
|
|
379
|
+
return Fr.fromString(await this.rollup.read.archiveAt([0n]));
|
|
264
380
|
}
|
|
265
381
|
|
|
266
382
|
/**
|
|
@@ -292,27 +408,79 @@ export class RollupContract {
|
|
|
292
408
|
};
|
|
293
409
|
}
|
|
294
410
|
|
|
295
|
-
getSlasherAddress() {
|
|
296
|
-
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
|
+
}
|
|
297
465
|
}
|
|
298
466
|
|
|
299
467
|
/**
|
|
300
468
|
* Returns a SlasherContract instance for interacting with the slasher contract.
|
|
301
469
|
*/
|
|
302
470
|
async getSlasherContract(): Promise<SlasherContract | undefined> {
|
|
303
|
-
const slasherAddress =
|
|
471
|
+
const slasherAddress = await this.getSlasherAddress();
|
|
304
472
|
if (slasherAddress.isZero()) {
|
|
305
473
|
return undefined;
|
|
306
474
|
}
|
|
307
475
|
return new SlasherContract(this.client, slasherAddress);
|
|
308
476
|
}
|
|
309
477
|
|
|
310
|
-
getOwner() {
|
|
311
|
-
return this.rollup.read.owner();
|
|
478
|
+
async getOwner(): Promise<EthAddress> {
|
|
479
|
+
return EthAddress.fromString(await this.rollup.read.owner());
|
|
312
480
|
}
|
|
313
481
|
|
|
314
|
-
getActiveAttesterCount() {
|
|
315
|
-
return this.rollup.read.getActiveAttesterCount();
|
|
482
|
+
async getActiveAttesterCount(): Promise<number> {
|
|
483
|
+
return Number(await this.rollup.read.getActiveAttesterCount());
|
|
316
484
|
}
|
|
317
485
|
|
|
318
486
|
public async getSlashingProposerAddress() {
|
|
@@ -323,7 +491,7 @@ export class RollupContract {
|
|
|
323
491
|
return await slasher.getProposer();
|
|
324
492
|
}
|
|
325
493
|
|
|
326
|
-
getCheckpointReward() {
|
|
494
|
+
getCheckpointReward(): Promise<bigint> {
|
|
327
495
|
return this.rollup.read.getCheckpointReward();
|
|
328
496
|
}
|
|
329
497
|
|
|
@@ -339,15 +507,19 @@ export class RollupContract {
|
|
|
339
507
|
return SlotNumber.fromBigInt(await this.rollup.read.getCurrentSlot());
|
|
340
508
|
}
|
|
341
509
|
|
|
342
|
-
getL1FeesAt(timestamp: bigint) {
|
|
343
|
-
|
|
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
|
+
};
|
|
344
516
|
}
|
|
345
517
|
|
|
346
|
-
|
|
347
|
-
return this.rollup.read.
|
|
518
|
+
getEthPerFeeAsset(): Promise<bigint> {
|
|
519
|
+
return this.rollup.read.getEthPerFeeAsset();
|
|
348
520
|
}
|
|
349
521
|
|
|
350
|
-
async getCommitteeAt(timestamp: bigint): Promise<
|
|
522
|
+
async getCommitteeAt(timestamp: bigint): Promise<EthAddress[] | undefined> {
|
|
351
523
|
const { result } = await this.client
|
|
352
524
|
.simulateContract({
|
|
353
525
|
address: this.address,
|
|
@@ -362,22 +534,22 @@ export class RollupContract {
|
|
|
362
534
|
throw e;
|
|
363
535
|
});
|
|
364
536
|
|
|
365
|
-
return result;
|
|
537
|
+
return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
|
|
366
538
|
}
|
|
367
539
|
|
|
368
|
-
getSampleSeedAt(timestamp: bigint) {
|
|
369
|
-
return this.rollup.read.getSampleSeedAt([timestamp]);
|
|
540
|
+
async getSampleSeedAt(timestamp: bigint): Promise<Buffer32> {
|
|
541
|
+
return Buffer32.fromBigInt(await this.rollup.read.getSampleSeedAt([timestamp]));
|
|
370
542
|
}
|
|
371
543
|
|
|
372
|
-
getCurrentSampleSeed() {
|
|
373
|
-
return this.rollup.read.getCurrentSampleSeed();
|
|
544
|
+
async getCurrentSampleSeed(): Promise<Buffer32> {
|
|
545
|
+
return Buffer32.fromBigInt(await this.rollup.read.getCurrentSampleSeed());
|
|
374
546
|
}
|
|
375
547
|
|
|
376
548
|
async getCurrentEpoch(): Promise<EpochNumber> {
|
|
377
549
|
return EpochNumber.fromBigInt(await this.rollup.read.getCurrentEpoch());
|
|
378
550
|
}
|
|
379
551
|
|
|
380
|
-
async getCurrentEpochCommittee(): Promise<
|
|
552
|
+
async getCurrentEpochCommittee(): Promise<EthAddress[] | undefined> {
|
|
381
553
|
const { result } = await this.client
|
|
382
554
|
.simulateContract({
|
|
383
555
|
address: this.address,
|
|
@@ -392,10 +564,10 @@ export class RollupContract {
|
|
|
392
564
|
throw e;
|
|
393
565
|
});
|
|
394
566
|
|
|
395
|
-
return result;
|
|
567
|
+
return result ? result.map(addr => EthAddress.fromString(addr)) : undefined;
|
|
396
568
|
}
|
|
397
569
|
|
|
398
|
-
async getCurrentProposer() {
|
|
570
|
+
async getCurrentProposer(): Promise<EthAddress> {
|
|
399
571
|
const { result } = await this.client.simulateContract({
|
|
400
572
|
address: this.address,
|
|
401
573
|
abi: RollupAbi,
|
|
@@ -403,10 +575,10 @@ export class RollupContract {
|
|
|
403
575
|
args: [],
|
|
404
576
|
});
|
|
405
577
|
|
|
406
|
-
return result;
|
|
578
|
+
return EthAddress.fromString(result);
|
|
407
579
|
}
|
|
408
580
|
|
|
409
|
-
async getProposerAt(timestamp: bigint) {
|
|
581
|
+
async getProposerAt(timestamp: bigint): Promise<EthAddress> {
|
|
410
582
|
const { result } = await this.client.simulateContract({
|
|
411
583
|
address: this.address,
|
|
412
584
|
abi: RollupAbi,
|
|
@@ -414,11 +586,26 @@ export class RollupContract {
|
|
|
414
586
|
args: [timestamp],
|
|
415
587
|
});
|
|
416
588
|
|
|
417
|
-
return result;
|
|
589
|
+
return EthAddress.fromString(result);
|
|
418
590
|
}
|
|
419
591
|
|
|
420
|
-
getCheckpoint(checkpointNumber: CheckpointNumber) {
|
|
421
|
-
|
|
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
|
+
};
|
|
422
609
|
}
|
|
423
610
|
|
|
424
611
|
/** Returns the pending checkpoint from the rollup contract */
|
|
@@ -444,16 +631,16 @@ export class RollupContract {
|
|
|
444
631
|
};
|
|
445
632
|
}
|
|
446
633
|
|
|
447
|
-
getTimestampForSlot(slot: SlotNumber) {
|
|
634
|
+
getTimestampForSlot(slot: SlotNumber): Promise<bigint> {
|
|
448
635
|
return this.rollup.read.getTimestampForSlot([BigInt(slot)]);
|
|
449
636
|
}
|
|
450
637
|
|
|
451
|
-
getEntryQueueLength() {
|
|
452
|
-
return this.rollup.read.getEntryQueueLength();
|
|
638
|
+
async getEntryQueueLength(): Promise<number> {
|
|
639
|
+
return Number(await this.rollup.read.getEntryQueueLength());
|
|
453
640
|
}
|
|
454
641
|
|
|
455
|
-
getAvailableValidatorFlushes() {
|
|
456
|
-
return this.rollup.read.getAvailableValidatorFlushes();
|
|
642
|
+
async getAvailableValidatorFlushes(): Promise<number> {
|
|
643
|
+
return Number(await this.rollup.read.getAvailableValidatorFlushes());
|
|
457
644
|
}
|
|
458
645
|
|
|
459
646
|
async getNextFlushableEpoch(): Promise<EpochNumber> {
|
|
@@ -509,10 +696,11 @@ export class RollupContract {
|
|
|
509
696
|
return EpochNumber.fromBigInt(await this.rollup.read.getEpochAtSlot([BigInt(slotNumber)]));
|
|
510
697
|
}
|
|
511
698
|
|
|
512
|
-
getEpochProofPublicInputs(
|
|
699
|
+
async getEpochProofPublicInputs(
|
|
513
700
|
args: readonly [bigint, bigint, EpochProofPublicInputArgs, readonly `0x${string}`[], `0x${string}`],
|
|
514
|
-
) {
|
|
515
|
-
|
|
701
|
+
): Promise<Fr[]> {
|
|
702
|
+
const result = await this.rollup.read.getEpochProofPublicInputs(args);
|
|
703
|
+
return result.map(Fr.fromString);
|
|
516
704
|
}
|
|
517
705
|
|
|
518
706
|
public async validateHeader(
|
|
@@ -654,85 +842,118 @@ export class RollupContract {
|
|
|
654
842
|
return this.rollup.read.getHasSubmitted([BigInt(epochNumber), BigInt(numberOfCheckpointsInEpoch), prover]);
|
|
655
843
|
}
|
|
656
844
|
|
|
657
|
-
|
|
658
|
-
return this.rollup.read.
|
|
845
|
+
getManaMinFeeAt(timestamp: bigint, inFeeAsset: boolean): Promise<bigint> {
|
|
846
|
+
return this.rollup.read.getManaMinFeeAt([timestamp, inFeeAsset]);
|
|
659
847
|
}
|
|
660
848
|
|
|
661
849
|
async getSlotAt(timestamp: bigint): Promise<SlotNumber> {
|
|
662
850
|
return SlotNumber.fromBigInt(await this.rollup.read.getSlotAt([timestamp]));
|
|
663
851
|
}
|
|
664
852
|
|
|
665
|
-
async status(checkpointNumber: CheckpointNumber, options?: { blockNumber?: bigint }) {
|
|
853
|
+
async status(checkpointNumber: CheckpointNumber, options?: { blockNumber?: bigint }): Promise<RollupStatusResponse> {
|
|
666
854
|
await checkBlockTag(options?.blockNumber, this.client);
|
|
667
|
-
|
|
855
|
+
const result = await this.rollup.read.status([BigInt(checkpointNumber)], options);
|
|
856
|
+
return {
|
|
857
|
+
provenCheckpointNumber: CheckpointNumber.fromBigInt(result[0]),
|
|
858
|
+
provenArchive: Fr.fromString(result[1]),
|
|
859
|
+
pendingCheckpointNumber: CheckpointNumber.fromBigInt(result[2]),
|
|
860
|
+
pendingArchive: Fr.fromString(result[3]),
|
|
861
|
+
archiveOfMyCheckpoint: Fr.fromString(result[4]),
|
|
862
|
+
};
|
|
668
863
|
}
|
|
669
864
|
|
|
670
|
-
async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }) {
|
|
865
|
+
async canPruneAtTime(timestamp: bigint, options?: { blockNumber?: bigint }): Promise<boolean> {
|
|
671
866
|
await checkBlockTag(options?.blockNumber, this.client);
|
|
672
867
|
return this.rollup.read.canPruneAtTime([timestamp], options);
|
|
673
868
|
}
|
|
674
869
|
|
|
675
|
-
archive() {
|
|
676
|
-
return this.rollup.read.archive();
|
|
870
|
+
async archive(): Promise<Fr> {
|
|
871
|
+
return Fr.fromString(await this.rollup.read.archive());
|
|
677
872
|
}
|
|
678
873
|
|
|
679
|
-
archiveAt(checkpointNumber: CheckpointNumber) {
|
|
680
|
-
return this.rollup.read.archiveAt([BigInt(checkpointNumber)]);
|
|
874
|
+
async archiveAt(checkpointNumber: CheckpointNumber): Promise<Fr> {
|
|
875
|
+
return Fr.fromString(await this.rollup.read.archiveAt([BigInt(checkpointNumber)]));
|
|
681
876
|
}
|
|
682
877
|
|
|
683
|
-
getSequencerRewards(address: Hex | EthAddress) {
|
|
878
|
+
getSequencerRewards(address: Hex | EthAddress): Promise<bigint> {
|
|
684
879
|
if (address instanceof EthAddress) {
|
|
685
880
|
address = address.toString();
|
|
686
881
|
}
|
|
687
882
|
return this.rollup.read.getSequencerRewards([address]);
|
|
688
883
|
}
|
|
689
884
|
|
|
690
|
-
getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress) {
|
|
885
|
+
getSpecificProverRewardsForEpoch(epoch: bigint, prover: Hex | EthAddress): Promise<bigint> {
|
|
691
886
|
if (prover instanceof EthAddress) {
|
|
692
887
|
prover = prover.toString();
|
|
693
888
|
}
|
|
694
889
|
return this.rollup.read.getSpecificProverRewardsForEpoch([epoch, prover]);
|
|
695
890
|
}
|
|
696
891
|
|
|
697
|
-
async getAttesters() {
|
|
892
|
+
async getAttesters(): Promise<EthAddress[]> {
|
|
698
893
|
const attesterSize = await this.getActiveAttesterCount();
|
|
699
894
|
const gse = new GSEContract(this.client, await this.getGSE());
|
|
700
895
|
const ts = (await this.client.getBlock()).timestamp;
|
|
701
896
|
|
|
702
|
-
const indices = Array.from({ length:
|
|
897
|
+
const indices = Array.from({ length: attesterSize }, (_, i) => BigInt(i));
|
|
703
898
|
const chunks = chunk(indices, 1000);
|
|
704
899
|
|
|
705
|
-
|
|
900
|
+
const results = await Promise.all(chunks.map(chunk => gse.getAttestersFromIndicesAtTime(this.address, ts, chunk)));
|
|
901
|
+
return results.flat().map(addr => EthAddress.fromString(addr));
|
|
706
902
|
}
|
|
707
903
|
|
|
708
|
-
getAttesterView(address: Hex | EthAddress) {
|
|
904
|
+
async getAttesterView(address: Hex | EthAddress): Promise<AttesterView> {
|
|
709
905
|
if (address instanceof EthAddress) {
|
|
710
906
|
address = address.toString();
|
|
711
907
|
}
|
|
712
|
-
|
|
908
|
+
const result = await this.rollup.read.getAttesterView([address]);
|
|
909
|
+
return {
|
|
910
|
+
status: result.status as AttesterStatus,
|
|
911
|
+
effectiveBalance: result.effectiveBalance,
|
|
912
|
+
exit: {
|
|
913
|
+
withdrawalId: result.exit.withdrawalId,
|
|
914
|
+
amount: result.exit.amount,
|
|
915
|
+
exitableAt: result.exit.exitableAt,
|
|
916
|
+
recipientOrWithdrawer: EthAddress.fromString(result.exit.recipientOrWithdrawer),
|
|
917
|
+
isRecipient: result.exit.isRecipient,
|
|
918
|
+
exists: result.exit.exists,
|
|
919
|
+
},
|
|
920
|
+
config: {
|
|
921
|
+
publicKey: {
|
|
922
|
+
x: result.config.publicKey.x,
|
|
923
|
+
y: result.config.publicKey.y,
|
|
924
|
+
},
|
|
925
|
+
withdrawer: EthAddress.fromString(result.config.withdrawer),
|
|
926
|
+
},
|
|
927
|
+
};
|
|
713
928
|
}
|
|
714
929
|
|
|
715
|
-
getStatus(address: Hex | EthAddress) {
|
|
930
|
+
async getStatus(address: Hex | EthAddress): Promise<AttesterStatus> {
|
|
716
931
|
if (address instanceof EthAddress) {
|
|
717
932
|
address = address.toString();
|
|
718
933
|
}
|
|
719
|
-
return this.rollup.read.getStatus([address]);
|
|
934
|
+
return (await this.rollup.read.getStatus([address])) as AttesterStatus;
|
|
720
935
|
}
|
|
721
936
|
|
|
722
|
-
getBlobCommitmentsHash(checkpointNumber: CheckpointNumber) {
|
|
723
|
-
return this.rollup.read.getBlobCommitmentsHash([BigInt(checkpointNumber)]);
|
|
937
|
+
async getBlobCommitmentsHash(checkpointNumber: CheckpointNumber): Promise<Buffer32> {
|
|
938
|
+
return Buffer32.fromString(await this.rollup.read.getBlobCommitmentsHash([BigInt(checkpointNumber)]));
|
|
724
939
|
}
|
|
725
940
|
|
|
726
|
-
getCurrentBlobCommitmentsHash() {
|
|
727
|
-
return this.rollup.read.getCurrentBlobCommitmentsHash();
|
|
941
|
+
async getCurrentBlobCommitmentsHash(): Promise<Buffer32> {
|
|
942
|
+
return Buffer32.fromString(await this.rollup.read.getCurrentBlobCommitmentsHash());
|
|
728
943
|
}
|
|
729
944
|
|
|
730
|
-
getStakingAsset() {
|
|
731
|
-
return this.rollup.read.getStakingAsset();
|
|
945
|
+
async getStakingAsset(): Promise<EthAddress> {
|
|
946
|
+
return EthAddress.fromString(await this.rollup.read.getStakingAsset());
|
|
732
947
|
}
|
|
733
948
|
|
|
734
|
-
getRewardConfig() {
|
|
735
|
-
|
|
949
|
+
async getRewardConfig(): Promise<RewardConfig> {
|
|
950
|
+
const result = await this.rollup.read.getRewardConfig();
|
|
951
|
+
return {
|
|
952
|
+
rewardDistributor: EthAddress.fromString(result.rewardDistributor),
|
|
953
|
+
sequencerBps: BigInt(result.sequencerBps),
|
|
954
|
+
booster: EthAddress.fromString(result.booster),
|
|
955
|
+
checkpointReward: result.checkpointReward,
|
|
956
|
+
};
|
|
736
957
|
}
|
|
737
958
|
|
|
738
959
|
setupEpoch(l1TxUtils: L1TxUtils) {
|
|
@@ -817,4 +1038,23 @@ export class RollupContract {
|
|
|
817
1038
|
},
|
|
818
1039
|
);
|
|
819
1040
|
}
|
|
1041
|
+
|
|
1042
|
+
/** Fetches CheckpointProposed events within the given block range. */
|
|
1043
|
+
async getCheckpointProposedEvents(fromBlock: bigint, toBlock: bigint): Promise<CheckpointProposedLog[]> {
|
|
1044
|
+
const logs = await this.rollup.getEvents.CheckpointProposed({}, { fromBlock, toBlock });
|
|
1045
|
+
return logs
|
|
1046
|
+
.filter(log => log.blockNumber! >= fromBlock && log.blockNumber! <= toBlock)
|
|
1047
|
+
.map(log => ({
|
|
1048
|
+
l1BlockNumber: log.blockNumber!,
|
|
1049
|
+
l1BlockHash: Buffer32.fromString(log.blockHash!),
|
|
1050
|
+
l1TransactionHash: log.transactionHash!,
|
|
1051
|
+
args: {
|
|
1052
|
+
checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber!),
|
|
1053
|
+
archive: Fr.fromString(log.args.archive!),
|
|
1054
|
+
versionedBlobHashes: log.args.versionedBlobHashes!.map(h => Buffer.from(h.slice(2), 'hex')),
|
|
1055
|
+
attestationsHash: log.args.attestationsHash ? Buffer32.fromString(log.args.attestationsHash) : undefined,
|
|
1056
|
+
payloadDigest: log.args.payloadDigest ? Buffer32.fromString(log.args.payloadDigest) : undefined,
|
|
1057
|
+
},
|
|
1058
|
+
}));
|
|
1059
|
+
}
|
|
820
1060
|
}
|