@aztec/ethereum 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2d9cb6034
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/client.d.ts +10 -2
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +13 -7
- package/dest/config.d.ts +3 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +11 -3
- package/dest/contracts/empire_base.d.ts +3 -1
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +3 -1
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +22 -15
- package/dest/contracts/fee_asset_handler.d.ts +1 -1
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/fee_asset_handler.js +2 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
- package/dest/contracts/fee_asset_price_oracle.js +651 -0
- package/dest/contracts/governance.d.ts +1 -1
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +5 -3
- package/dest/contracts/governance_proposer.d.ts +3 -1
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +13 -1
- package/dest/contracts/index.d.ts +2 -1
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +1 -0
- package/dest/contracts/multicall.d.ts +51 -2
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +87 -1
- package/dest/contracts/registry.d.ts +3 -1
- package/dest/contracts/registry.d.ts.map +1 -1
- package/dest/contracts/registry.js +30 -1
- package/dest/contracts/rollup.d.ts +46 -9
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +215 -17
- package/dest/contracts/tally_slashing_proposer.d.ts +1 -1
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +8 -1
- package/dest/deploy_aztec_l1_contracts.d.ts +2 -3
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +37 -22
- package/dest/deploy_l1_contract.js +3 -3
- package/dest/generated/l1-contracts-defaults.d.ts +1 -1
- package/dest/generated/l1-contracts-defaults.js +1 -1
- package/dest/l1_artifacts.d.ts +1051 -42
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_reader.d.ts +3 -1
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +6 -1
- package/dest/l1_tx_utils/config.d.ts +7 -1
- package/dest/l1_tx_utils/config.d.ts.map +1 -1
- package/dest/l1_tx_utils/config.js +14 -1
- package/dest/l1_tx_utils/constants.d.ts +1 -1
- package/dest/l1_tx_utils/constants.js +2 -2
- package/dest/l1_tx_utils/factory.d.ts +18 -10
- package/dest/l1_tx_utils/factory.d.ts.map +1 -1
- package/dest/l1_tx_utils/factory.js +17 -7
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
- package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
- package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
- package/dest/l1_tx_utils/index-blobs.js +2 -2
- package/dest/l1_tx_utils/index.d.ts +2 -1
- package/dest/l1_tx_utils/index.d.ts.map +1 -1
- package/dest/l1_tx_utils/index.js +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +20 -7
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +80 -56
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +11 -7
- package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
- package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
- package/dest/publisher_manager.d.ts +21 -6
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +81 -7
- package/dest/test/chain_monitor.d.ts +22 -3
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +33 -2
- package/dest/test/eth_cheat_codes.d.ts +6 -4
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +6 -4
- package/dest/test/index.d.ts +1 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +0 -2
- package/dest/test/start_anvil.d.ts +23 -3
- package/dest/test/start_anvil.d.ts.map +1 -1
- package/dest/test/start_anvil.js +143 -29
- package/dest/test/upgrade_utils.js +2 -2
- package/dest/utils.d.ts +2 -1
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +62 -12
- package/package.json +5 -7
- package/src/client.ts +10 -2
- package/src/config.ts +15 -2
- package/src/contracts/empire_base.ts +2 -0
- package/src/contracts/empire_slashing_proposer.ts +22 -27
- package/src/contracts/fee_asset_handler.ts +2 -0
- package/src/contracts/fee_asset_price_oracle.ts +280 -0
- package/src/contracts/governance.ts +5 -3
- package/src/contracts/governance_proposer.ts +10 -1
- package/src/contracts/index.ts +1 -0
- package/src/contracts/multicall.ts +70 -3
- package/src/contracts/registry.ts +31 -1
- package/src/contracts/rollup.ts +244 -21
- package/src/contracts/tally_slashing_proposer.ts +5 -1
- package/src/deploy_aztec_l1_contracts.ts +60 -29
- package/src/deploy_l1_contract.ts +3 -3
- package/src/generated/l1-contracts-defaults.ts +1 -1
- package/src/l1_reader.ts +13 -1
- package/src/l1_tx_utils/config.ts +20 -0
- package/src/l1_tx_utils/constants.ts +2 -2
- package/src/l1_tx_utils/factory.ts +31 -31
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
- package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
- package/src/l1_tx_utils/index-blobs.ts +2 -2
- package/src/l1_tx_utils/index.ts +1 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +73 -35
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +11 -7
- package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
- package/src/publisher_manager.ts +107 -10
- package/src/test/chain_monitor.ts +60 -3
- package/src/test/eth_cheat_codes.ts +6 -4
- package/src/test/index.ts +0 -2
- package/src/test/start_anvil.ts +177 -29
- package/src/test/upgrade_utils.ts +2 -2
- package/src/utils.ts +70 -14
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
- package/dest/test/delayed_tx_utils.d.ts +0 -13
- package/dest/test/delayed_tx_utils.d.ts.map +0 -1
- package/dest/test/delayed_tx_utils.js +0 -28
- package/dest/test/tx_delayer.d.ts +0 -36
- package/dest/test/tx_delayer.d.ts.map +0 -1
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
- package/src/test/delayed_tx_utils.ts +0 -52
package/src/contracts/rollup.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
4
4
|
import { memoize } from '@aztec/foundation/decorators';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import type { ViemSignature } from '@aztec/foundation/eth-signature';
|
|
7
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
7
8
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
8
9
|
import { EscapeHatchAbi } from '@aztec/l1-artifacts/EscapeHatchAbi';
|
|
9
10
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
type Hex,
|
|
17
18
|
type StateOverride,
|
|
18
19
|
type WatchContractEventReturnType,
|
|
20
|
+
encodeAbiParameters,
|
|
19
21
|
encodeFunctionData,
|
|
20
22
|
getContract,
|
|
21
23
|
hexToBigInt,
|
|
@@ -134,6 +136,14 @@ export type L1FeeData = {
|
|
|
134
136
|
blobFee: bigint;
|
|
135
137
|
};
|
|
136
138
|
|
|
139
|
+
/** Components of the minimum fee per mana, as returned by the L1 rollup contract. */
|
|
140
|
+
export type ManaMinFeeComponents = {
|
|
141
|
+
sequencerCost: bigint;
|
|
142
|
+
proverCost: bigint;
|
|
143
|
+
congestionCost: bigint;
|
|
144
|
+
congestionMultiplier: bigint;
|
|
145
|
+
};
|
|
146
|
+
|
|
137
147
|
/**
|
|
138
148
|
* Reward configuration for the rollup
|
|
139
149
|
*/
|
|
@@ -193,10 +203,10 @@ export type CheckpointProposedArgs = {
|
|
|
193
203
|
checkpointNumber: CheckpointNumber;
|
|
194
204
|
archive: Fr;
|
|
195
205
|
versionedBlobHashes: Buffer[];
|
|
196
|
-
/** Hash of attestations
|
|
197
|
-
attestationsHash
|
|
198
|
-
/** Digest of the payload
|
|
199
|
-
payloadDigest
|
|
206
|
+
/** Hash of attestations emitted in the CheckpointProposed event. */
|
|
207
|
+
attestationsHash: Buffer32;
|
|
208
|
+
/** Digest of the payload emitted in the CheckpointProposed event. */
|
|
209
|
+
payloadDigest: Buffer32;
|
|
200
210
|
};
|
|
201
211
|
|
|
202
212
|
/** Log type for CheckpointProposed events. */
|
|
@@ -204,6 +214,7 @@ export type CheckpointProposedLog = L1EventLog<CheckpointProposedArgs>;
|
|
|
204
214
|
|
|
205
215
|
export class RollupContract {
|
|
206
216
|
private readonly rollup: GetContractReturnType<typeof RollupAbi, ViemClient>;
|
|
217
|
+
private readonly logger = createLogger('ethereum:rollup');
|
|
207
218
|
|
|
208
219
|
private static cachedStfStorageSlot: Hex | undefined;
|
|
209
220
|
private cachedEscapeHatch?: {
|
|
@@ -379,6 +390,20 @@ export class RollupContract {
|
|
|
379
390
|
return Fr.fromString(await this.rollup.read.archiveAt([0n]));
|
|
380
391
|
}
|
|
381
392
|
|
|
393
|
+
@memoize
|
|
394
|
+
async getVkTreeRoot(): Promise<Fr> {
|
|
395
|
+
const slot = BigInt(RollupContract.stfStorageSlot) + 3n;
|
|
396
|
+
const value = await this.client.getStorageAt({ address: this.address, slot: `0x${slot.toString(16)}` });
|
|
397
|
+
return Fr.fromString(value ?? '0x0');
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
@memoize
|
|
401
|
+
async getProtocolContractsHash(): Promise<Fr> {
|
|
402
|
+
const slot = BigInt(RollupContract.stfStorageSlot) + 4n;
|
|
403
|
+
const value = await this.client.getStorageAt({ address: this.address, slot: `0x${slot.toString(16)}` });
|
|
404
|
+
return Fr.fromString(value ?? '0x0');
|
|
405
|
+
}
|
|
406
|
+
|
|
382
407
|
/**
|
|
383
408
|
* Returns rollup constants used for epoch queries.
|
|
384
409
|
* Return type is `L1RollupConstants` which is defined in stdlib,
|
|
@@ -391,13 +416,25 @@ export class RollupContract {
|
|
|
391
416
|
slotDuration: number;
|
|
392
417
|
epochDuration: number;
|
|
393
418
|
proofSubmissionEpochs: number;
|
|
419
|
+
targetCommitteeSize: number;
|
|
420
|
+
rollupManaLimit: number;
|
|
394
421
|
}> {
|
|
395
|
-
const [
|
|
422
|
+
const [
|
|
423
|
+
l1StartBlock,
|
|
424
|
+
l1GenesisTime,
|
|
425
|
+
slotDuration,
|
|
426
|
+
epochDuration,
|
|
427
|
+
proofSubmissionEpochs,
|
|
428
|
+
targetCommitteeSize,
|
|
429
|
+
rollupManaLimit,
|
|
430
|
+
] = await Promise.all([
|
|
396
431
|
this.getL1StartBlock(),
|
|
397
432
|
this.getL1GenesisTime(),
|
|
398
433
|
this.getSlotDuration(),
|
|
399
434
|
this.getEpochDuration(),
|
|
400
435
|
this.getProofSubmissionEpochs(),
|
|
436
|
+
this.getTargetCommitteeSize(),
|
|
437
|
+
this.getManaLimit(),
|
|
401
438
|
]);
|
|
402
439
|
return {
|
|
403
440
|
l1StartBlock,
|
|
@@ -405,6 +442,8 @@ export class RollupContract {
|
|
|
405
442
|
slotDuration,
|
|
406
443
|
epochDuration: Number(epochDuration),
|
|
407
444
|
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
445
|
+
targetCommitteeSize,
|
|
446
|
+
rollupManaLimit: Number(rollupManaLimit),
|
|
408
447
|
};
|
|
409
448
|
}
|
|
410
449
|
|
|
@@ -459,7 +498,11 @@ export class RollupContract {
|
|
|
459
498
|
|
|
460
499
|
const [isOpen] = await escapeHatch.read.isHatchOpen([BigInt(epoch)]);
|
|
461
500
|
return isOpen;
|
|
462
|
-
} catch {
|
|
501
|
+
} catch (err) {
|
|
502
|
+
this.logger.warn('isEscapeHatchOpen failed (treating as closed); RPC or contract error may cause liveness risk', {
|
|
503
|
+
epoch: Number(epoch),
|
|
504
|
+
error: err,
|
|
505
|
+
});
|
|
463
506
|
return false;
|
|
464
507
|
}
|
|
465
508
|
}
|
|
@@ -499,8 +542,9 @@ export class RollupContract {
|
|
|
499
542
|
return CheckpointNumber.fromBigInt(await this.rollup.read.getPendingCheckpointNumber());
|
|
500
543
|
}
|
|
501
544
|
|
|
502
|
-
async getProvenCheckpointNumber(): Promise<CheckpointNumber> {
|
|
503
|
-
|
|
545
|
+
async getProvenCheckpointNumber(options?: { blockNumber?: bigint }): Promise<CheckpointNumber> {
|
|
546
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
547
|
+
return CheckpointNumber.fromBigInt(await this.rollup.read.getProvenCheckpointNumber(options));
|
|
504
548
|
}
|
|
505
549
|
|
|
506
550
|
async getSlotNumber(): Promise<SlotNumber> {
|
|
@@ -741,16 +785,23 @@ export class RollupContract {
|
|
|
741
785
|
* timestamp of the next L1 block
|
|
742
786
|
* @throws otherwise
|
|
743
787
|
*/
|
|
744
|
-
public async
|
|
788
|
+
public async canProposeAt(
|
|
745
789
|
archive: Buffer,
|
|
746
790
|
account: `0x${string}` | Account,
|
|
747
|
-
|
|
748
|
-
opts: {
|
|
791
|
+
timestamp: bigint,
|
|
792
|
+
opts: {
|
|
793
|
+
forcePendingCheckpointNumber?: CheckpointNumber;
|
|
794
|
+
forceArchive?: { checkpointNumber: CheckpointNumber; archive: Fr };
|
|
795
|
+
} = {},
|
|
749
796
|
): Promise<{ slot: SlotNumber; checkpointNumber: CheckpointNumber; timeOfNextL1Slot: bigint }> {
|
|
750
|
-
const
|
|
751
|
-
const timeOfNextL1Slot = latestBlock.timestamp + BigInt(slotDuration);
|
|
797
|
+
const timeOfNextL1Slot = timestamp;
|
|
752
798
|
const who = typeof account === 'string' ? account : account.address;
|
|
753
799
|
|
|
800
|
+
const stateOverride = RollupContract.mergeStateOverrides(
|
|
801
|
+
await this.makePendingCheckpointNumberOverride(opts.forcePendingCheckpointNumber),
|
|
802
|
+
opts.forceArchive ? this.makeArchiveOverride(opts.forceArchive.checkpointNumber, opts.forceArchive.archive) : [],
|
|
803
|
+
);
|
|
804
|
+
|
|
754
805
|
try {
|
|
755
806
|
const {
|
|
756
807
|
result: [slot, checkpointNumber],
|
|
@@ -760,7 +811,7 @@ export class RollupContract {
|
|
|
760
811
|
functionName: 'canProposeAtTime',
|
|
761
812
|
args: [timeOfNextL1Slot, `0x${archive.toString('hex')}`, who],
|
|
762
813
|
account,
|
|
763
|
-
stateOverride
|
|
814
|
+
stateOverride,
|
|
764
815
|
});
|
|
765
816
|
|
|
766
817
|
return {
|
|
@@ -796,6 +847,151 @@ export class RollupContract {
|
|
|
796
847
|
];
|
|
797
848
|
}
|
|
798
849
|
|
|
850
|
+
/**
|
|
851
|
+
* Returns a state override that sets tempCheckpointLogs[checkpointNumber].feeHeader to the compressed fee header.
|
|
852
|
+
* Used when simulating a propose call where the parent checkpoint hasn't landed on L1 yet (pipelining).
|
|
853
|
+
*/
|
|
854
|
+
public async makeFeeHeaderOverride(checkpointNumber: CheckpointNumber, feeHeader: FeeHeader): Promise<StateOverride> {
|
|
855
|
+
const { epochDuration, proofSubmissionEpochs } = await this.getRollupConstants();
|
|
856
|
+
const roundaboutSize = BigInt(epochDuration * (proofSubmissionEpochs + 1) + 1);
|
|
857
|
+
const circularIndex = BigInt(checkpointNumber) % roundaboutSize;
|
|
858
|
+
|
|
859
|
+
// tempCheckpointLogs is at offset 2 in RollupStore
|
|
860
|
+
const tempCheckpointLogsMappingBase = hexToBigInt(RollupContract.stfStorageSlot) + 2n;
|
|
861
|
+
|
|
862
|
+
// Solidity mapping slot: keccak256(abi.encode(key, baseSlot))
|
|
863
|
+
const structBaseSlot = hexToBigInt(
|
|
864
|
+
keccak256(
|
|
865
|
+
encodeAbiParameters([{ type: 'uint256' }, { type: 'uint256' }], [circularIndex, tempCheckpointLogsMappingBase]),
|
|
866
|
+
),
|
|
867
|
+
);
|
|
868
|
+
|
|
869
|
+
// feeHeader is the 7th field (offset 6) in CompressedTempCheckpointLog
|
|
870
|
+
const feeHeaderSlot = structBaseSlot + 6n;
|
|
871
|
+
const compressed = RollupContract.compressFeeHeader(feeHeader);
|
|
872
|
+
|
|
873
|
+
return [
|
|
874
|
+
{
|
|
875
|
+
address: this.address,
|
|
876
|
+
stateDiff: [
|
|
877
|
+
{
|
|
878
|
+
slot: `0x${feeHeaderSlot.toString(16).padStart(64, '0')}`,
|
|
879
|
+
value: `0x${compressed.toString(16).padStart(64, '0')}`,
|
|
880
|
+
},
|
|
881
|
+
],
|
|
882
|
+
},
|
|
883
|
+
];
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/**
|
|
887
|
+
* Returns a state override that sets archives[checkpointNumber] to the given archive value.
|
|
888
|
+
* Used when simulating a canProposeAtTime call where the local archive differs from L1
|
|
889
|
+
* (e.g. pipelining where the parent checkpoint hasn't landed on L1 yet).
|
|
890
|
+
*/
|
|
891
|
+
public makeArchiveOverride(checkpointNumber: CheckpointNumber, archive: Fr): StateOverride {
|
|
892
|
+
const archivesMappingBase = hexToBigInt(RollupContract.stfStorageSlot) + 1n;
|
|
893
|
+
const archiveSlot = hexToBigInt(
|
|
894
|
+
keccak256(
|
|
895
|
+
encodeAbiParameters(
|
|
896
|
+
[{ type: 'uint256' }, { type: 'uint256' }],
|
|
897
|
+
[BigInt(checkpointNumber), archivesMappingBase],
|
|
898
|
+
),
|
|
899
|
+
),
|
|
900
|
+
);
|
|
901
|
+
return [
|
|
902
|
+
{
|
|
903
|
+
address: this.address,
|
|
904
|
+
stateDiff: [
|
|
905
|
+
{
|
|
906
|
+
slot: `0x${archiveSlot.toString(16).padStart(64, '0')}`,
|
|
907
|
+
value: archive.toString(),
|
|
908
|
+
},
|
|
909
|
+
],
|
|
910
|
+
},
|
|
911
|
+
];
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
/** Merges multiple StateOverride arrays, combining stateDiff entries for the same address. */
|
|
915
|
+
public static mergeStateOverrides(...overrides: StateOverride[]): StateOverride {
|
|
916
|
+
type StateDiffEntry = { slot: `0x${string}`; value: `0x${string}` };
|
|
917
|
+
const byAddress = new Map<string, { address: `0x${string}`; balance?: bigint; stateDiff: StateDiffEntry[] }>();
|
|
918
|
+
for (const override of overrides) {
|
|
919
|
+
for (const entry of override) {
|
|
920
|
+
const key = entry.address.toLowerCase();
|
|
921
|
+
const existing = byAddress.get(key);
|
|
922
|
+
if (existing) {
|
|
923
|
+
existing.stateDiff.push(...(entry.stateDiff ?? []));
|
|
924
|
+
if (entry.balance !== undefined) {
|
|
925
|
+
existing.balance = entry.balance;
|
|
926
|
+
}
|
|
927
|
+
} else {
|
|
928
|
+
byAddress.set(key, {
|
|
929
|
+
address: entry.address,
|
|
930
|
+
balance: entry.balance,
|
|
931
|
+
stateDiff: [...(entry.stateDiff ?? [])],
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
return [...byAddress.values()];
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/** Compresses a FeeHeader into a uint256 matching FeeHeaderLib.compress() in FeeStructs.sol. */
|
|
940
|
+
public static compressFeeHeader(feeHeader: FeeHeader): bigint {
|
|
941
|
+
const MASK_48_BITS = (1n << 48n) - 1n;
|
|
942
|
+
const MASK_64_BITS = (1n << 64n) - 1n;
|
|
943
|
+
const MASK_63_BITS = (1n << 63n) - 1n;
|
|
944
|
+
|
|
945
|
+
let value = BigInt(feeHeader.manaUsed) & ((1n << 32n) - 1n); // bits [0:31]
|
|
946
|
+
value |= (feeHeader.excessMana < MASK_48_BITS ? feeHeader.excessMana : MASK_48_BITS) << 32n; // bits [32:79]
|
|
947
|
+
value |= (BigInt(feeHeader.ethPerFeeAsset) & MASK_48_BITS) << 80n; // bits [80:127]
|
|
948
|
+
value |= (feeHeader.congestionCost < MASK_64_BITS ? feeHeader.congestionCost : MASK_64_BITS) << 128n; // bits [128:191]
|
|
949
|
+
value |= (feeHeader.proverCost < MASK_63_BITS ? feeHeader.proverCost : MASK_63_BITS) << 192n; // bits [192:254]
|
|
950
|
+
value |= 1n << 255n; // preheat flag
|
|
951
|
+
return value;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/** Computes the fee header for a child checkpoint given parent fee header and child data.
|
|
955
|
+
* Must stay in sync with Solidity FeeLib.sol (computeNewEthPerFeeAsset, clampedAdd). */
|
|
956
|
+
public static computeChildFeeHeader(
|
|
957
|
+
parentFeeHeader: FeeHeader,
|
|
958
|
+
childManaUsed: bigint,
|
|
959
|
+
feeAssetPriceModifier: bigint,
|
|
960
|
+
manaTarget: bigint,
|
|
961
|
+
): FeeHeader {
|
|
962
|
+
const MIN_ETH_PER_FEE_ASSET = 100n;
|
|
963
|
+
const MAX_ETH_PER_FEE_ASSET = 100_000_000_000_000n; // 1e14, matches FeeLib.sol
|
|
964
|
+
|
|
965
|
+
// excessMana = clampedAdd(parent.excessMana + parent.manaUsed, -manaTarget)
|
|
966
|
+
const sum = parentFeeHeader.excessMana + parentFeeHeader.manaUsed;
|
|
967
|
+
const excessMana = sum > manaTarget ? sum - manaTarget : 0n;
|
|
968
|
+
|
|
969
|
+
// ethPerFeeAsset = computeNewEthPerFeeAsset(max(parent.ethPerFeeAsset, MIN), modifier)
|
|
970
|
+
const parentPrice =
|
|
971
|
+
parentFeeHeader.ethPerFeeAsset > MIN_ETH_PER_FEE_ASSET ? parentFeeHeader.ethPerFeeAsset : MIN_ETH_PER_FEE_ASSET;
|
|
972
|
+
let newPrice: bigint;
|
|
973
|
+
if (feeAssetPriceModifier >= 0n) {
|
|
974
|
+
newPrice = (parentPrice * (10_000n + feeAssetPriceModifier)) / 10_000n;
|
|
975
|
+
} else {
|
|
976
|
+
const absMod = -feeAssetPriceModifier;
|
|
977
|
+
newPrice = (parentPrice * (10_000n - absMod)) / 10_000n;
|
|
978
|
+
}
|
|
979
|
+
if (newPrice < MIN_ETH_PER_FEE_ASSET) {
|
|
980
|
+
newPrice = MIN_ETH_PER_FEE_ASSET;
|
|
981
|
+
}
|
|
982
|
+
if (newPrice > MAX_ETH_PER_FEE_ASSET) {
|
|
983
|
+
newPrice = MAX_ETH_PER_FEE_ASSET;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
return {
|
|
987
|
+
excessMana,
|
|
988
|
+
manaUsed: childManaUsed,
|
|
989
|
+
ethPerFeeAsset: newPrice,
|
|
990
|
+
congestionCost: 0n,
|
|
991
|
+
proverCost: 0n,
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
|
|
799
995
|
/** Creates a request to Rollup#invalidateBadAttestation to be simulated or sent */
|
|
800
996
|
public buildInvalidateBadAttestationRequest(
|
|
801
997
|
checkpointNumber: CheckpointNumber,
|
|
@@ -805,6 +1001,7 @@ export class RollupContract {
|
|
|
805
1001
|
): L1TxRequest {
|
|
806
1002
|
return {
|
|
807
1003
|
to: this.address,
|
|
1004
|
+
abi: RollupAbi,
|
|
808
1005
|
data: encodeFunctionData({
|
|
809
1006
|
abi: RollupAbi,
|
|
810
1007
|
functionName: 'invalidateBadAttestation',
|
|
@@ -826,6 +1023,7 @@ export class RollupContract {
|
|
|
826
1023
|
): L1TxRequest {
|
|
827
1024
|
return {
|
|
828
1025
|
to: this.address,
|
|
1026
|
+
abi: RollupAbi,
|
|
829
1027
|
data: encodeFunctionData({
|
|
830
1028
|
abi: RollupAbi,
|
|
831
1029
|
functionName: 'invalidateInsufficientAttestations',
|
|
@@ -842,8 +1040,18 @@ export class RollupContract {
|
|
|
842
1040
|
return this.rollup.read.getHasSubmitted([BigInt(epochNumber), BigInt(numberOfCheckpointsInEpoch), prover]);
|
|
843
1041
|
}
|
|
844
1042
|
|
|
845
|
-
getManaMinFeeAt(timestamp: bigint, inFeeAsset: boolean): Promise<bigint> {
|
|
846
|
-
return this.rollup.read.getManaMinFeeAt([timestamp, inFeeAsset]);
|
|
1043
|
+
getManaMinFeeAt(timestamp: bigint, inFeeAsset: boolean, stateOverride?: StateOverride): Promise<bigint> {
|
|
1044
|
+
return this.rollup.read.getManaMinFeeAt([timestamp, inFeeAsset], { stateOverride });
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
async getManaMinFeeComponentsAt(timestamp: bigint, inFeeAsset: boolean): Promise<ManaMinFeeComponents> {
|
|
1048
|
+
const result = await this.rollup.read.getManaMinFeeComponentsAt([timestamp, inFeeAsset]);
|
|
1049
|
+
return {
|
|
1050
|
+
sequencerCost: result.sequencerCost,
|
|
1051
|
+
proverCost: result.proverCost,
|
|
1052
|
+
congestionCost: result.congestionCost,
|
|
1053
|
+
congestionMultiplier: result.congestionMultiplier,
|
|
1054
|
+
};
|
|
847
1055
|
}
|
|
848
1056
|
|
|
849
1057
|
async getSlotAt(timestamp: bigint): Promise<SlotNumber> {
|
|
@@ -889,11 +1097,10 @@ export class RollupContract {
|
|
|
889
1097
|
return this.rollup.read.getSpecificProverRewardsForEpoch([epoch, prover]);
|
|
890
1098
|
}
|
|
891
1099
|
|
|
892
|
-
async getAttesters(): Promise<EthAddress[]> {
|
|
1100
|
+
async getAttesters(timestamp?: bigint): Promise<EthAddress[]> {
|
|
893
1101
|
const attesterSize = await this.getActiveAttesterCount();
|
|
894
1102
|
const gse = new GSEContract(this.client, await this.getGSE());
|
|
895
|
-
const ts = (await this.client.getBlock()).timestamp;
|
|
896
|
-
|
|
1103
|
+
const ts = timestamp ?? (await this.client.getBlock()).timestamp;
|
|
897
1104
|
const indices = Array.from({ length: attesterSize }, (_, i) => BigInt(i));
|
|
898
1105
|
const chunks = chunk(indices, 1000);
|
|
899
1106
|
|
|
@@ -959,6 +1166,7 @@ export class RollupContract {
|
|
|
959
1166
|
setupEpoch(l1TxUtils: L1TxUtils) {
|
|
960
1167
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
961
1168
|
to: this.address,
|
|
1169
|
+
abi: RollupAbi,
|
|
962
1170
|
data: encodeFunctionData({
|
|
963
1171
|
abi: RollupAbi,
|
|
964
1172
|
functionName: 'setupEpoch',
|
|
@@ -970,6 +1178,7 @@ export class RollupContract {
|
|
|
970
1178
|
vote(l1TxUtils: L1TxUtils, proposalId: bigint) {
|
|
971
1179
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
972
1180
|
to: this.address,
|
|
1181
|
+
abi: RollupAbi,
|
|
973
1182
|
data: encodeFunctionData({
|
|
974
1183
|
abi: RollupAbi,
|
|
975
1184
|
functionName: 'vote',
|
|
@@ -1052,8 +1261,22 @@ export class RollupContract {
|
|
|
1052
1261
|
checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber!),
|
|
1053
1262
|
archive: Fr.fromString(log.args.archive!),
|
|
1054
1263
|
versionedBlobHashes: log.args.versionedBlobHashes!.map(h => Buffer.from(h.slice(2), 'hex')),
|
|
1055
|
-
attestationsHash:
|
|
1056
|
-
|
|
1264
|
+
attestationsHash: (() => {
|
|
1265
|
+
if (!log.args.attestationsHash) {
|
|
1266
|
+
throw new Error(
|
|
1267
|
+
`CheckpointProposed event missing attestationsHash for checkpoint ${log.args.checkpointNumber}`,
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
return Buffer32.fromString(log.args.attestationsHash);
|
|
1271
|
+
})(),
|
|
1272
|
+
payloadDigest: (() => {
|
|
1273
|
+
if (!log.args.payloadDigest) {
|
|
1274
|
+
throw new Error(
|
|
1275
|
+
`CheckpointProposed event missing payloadDigest for checkpoint ${log.args.checkpointNumber}`,
|
|
1276
|
+
);
|
|
1277
|
+
}
|
|
1278
|
+
return Buffer32.fromString(log.args.payloadDigest);
|
|
1279
|
+
})(),
|
|
1057
1280
|
},
|
|
1058
1281
|
}));
|
|
1059
1282
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { L1TxRequest } from '@aztec/ethereum/l1-tx-utils';
|
|
2
2
|
import type { ViemClient } from '@aztec/ethereum/types';
|
|
3
|
-
import { tryExtractEvent } from '@aztec/ethereum/utils';
|
|
3
|
+
import { mergeAbis, tryExtractEvent } from '@aztec/ethereum/utils';
|
|
4
4
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
5
5
|
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
6
6
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
7
7
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
8
8
|
import { hexToBuffer } from '@aztec/foundation/string';
|
|
9
|
+
import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
|
|
9
10
|
import { TallySlashingProposerAbi } from '@aztec/l1-artifacts/TallySlashingProposerAbi';
|
|
10
11
|
|
|
11
12
|
import {
|
|
@@ -160,6 +161,7 @@ export class TallySlashingProposerContract {
|
|
|
160
161
|
|
|
161
162
|
return {
|
|
162
163
|
to: this.contract.address,
|
|
164
|
+
abi: TallySlashingProposerAbi,
|
|
163
165
|
data: encodeFunctionData({
|
|
164
166
|
abi: TallySlashingProposerAbi,
|
|
165
167
|
functionName: 'vote',
|
|
@@ -207,6 +209,7 @@ export class TallySlashingProposerContract {
|
|
|
207
209
|
public buildVoteRequestWithSignature(votes: Hex, signature: { v: number; r: Hex; s: Hex }): L1TxRequest {
|
|
208
210
|
return {
|
|
209
211
|
to: this.contract.address,
|
|
212
|
+
abi: TallySlashingProposerAbi,
|
|
210
213
|
data: encodeFunctionData({
|
|
211
214
|
abi: TallySlashingProposerAbi,
|
|
212
215
|
functionName: 'vote',
|
|
@@ -224,6 +227,7 @@ export class TallySlashingProposerContract {
|
|
|
224
227
|
public buildExecuteRoundRequest(round: bigint, committees: EthAddress[][]): L1TxRequest {
|
|
225
228
|
return {
|
|
226
229
|
to: this.contract.address,
|
|
230
|
+
abi: mergeAbis([TallySlashingProposerAbi, SlasherAbi]),
|
|
227
231
|
data: encodeFunctionData({
|
|
228
232
|
abi: TallySlashingProposerAbi,
|
|
229
233
|
functionName: 'executeRound',
|
|
@@ -15,7 +15,7 @@ import { tmpdir } from 'os';
|
|
|
15
15
|
import { dirname, join, resolve } from 'path';
|
|
16
16
|
import readline from 'readline';
|
|
17
17
|
import type { Hex } from 'viem';
|
|
18
|
-
import {
|
|
18
|
+
import { mainnet, sepolia } from 'viem/chains';
|
|
19
19
|
|
|
20
20
|
import { createEthereumChain, isAnvilTestChain } from './chain.js';
|
|
21
21
|
import { createExtendedL1Client } from './client.js';
|
|
@@ -23,7 +23,6 @@ import type { L1ContractsConfig } from './config.js';
|
|
|
23
23
|
import { deployMulticall3 } from './contracts/multicall.js';
|
|
24
24
|
import { RollupContract } from './contracts/rollup.js';
|
|
25
25
|
import type { L1ContractAddresses } from './l1_contract_addresses.js';
|
|
26
|
-
import type { L1TxUtilsConfig } from './l1_tx_utils/config.js';
|
|
27
26
|
import type { ExtendedViemWalletClient } from './types.js';
|
|
28
27
|
|
|
29
28
|
const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
|
|
@@ -31,9 +30,9 @@ const logger = createLogger('ethereum:deploy_aztec_l1_contracts');
|
|
|
31
30
|
const JSON_DEPLOY_RESULT_PREFIX = 'JSON DEPLOY RESULT:';
|
|
32
31
|
|
|
33
32
|
/**
|
|
34
|
-
* Runs a process
|
|
35
|
-
*
|
|
36
|
-
*
|
|
33
|
+
* Runs a process and parses JSON deploy results from stdout.
|
|
34
|
+
* Lines starting with JSON_DEPLOY_RESULT_PREFIX are parsed and returned.
|
|
35
|
+
* All other stdout goes to logger.info, stderr goes to logger.warn.
|
|
37
36
|
*/
|
|
38
37
|
function runProcess<T>(
|
|
39
38
|
command: string,
|
|
@@ -49,26 +48,41 @@ function runProcess<T>(
|
|
|
49
48
|
});
|
|
50
49
|
|
|
51
50
|
let result: T | undefined;
|
|
51
|
+
let parseError: Error | undefined;
|
|
52
|
+
let settled = false;
|
|
52
53
|
|
|
53
54
|
readline.createInterface({ input: proc.stdout }).on('line', line => {
|
|
54
55
|
const trimmedLine = line.trim();
|
|
55
56
|
if (trimmedLine.startsWith(JSON_DEPLOY_RESULT_PREFIX)) {
|
|
56
57
|
const jsonStr = trimmedLine.slice(JSON_DEPLOY_RESULT_PREFIX.length).trim();
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
try {
|
|
59
|
+
result = JSON.parse(jsonStr);
|
|
60
|
+
} catch {
|
|
61
|
+
parseError = new Error(`Failed to parse deploy result JSON: ${jsonStr.slice(0, 200)}`);
|
|
62
|
+
}
|
|
59
63
|
} else {
|
|
60
64
|
logger.info(line);
|
|
61
65
|
}
|
|
62
66
|
});
|
|
63
|
-
readline.createInterface({ input: proc.stderr }).on('line', logger.
|
|
67
|
+
readline.createInterface({ input: proc.stderr }).on('line', logger.warn.bind(logger));
|
|
64
68
|
|
|
65
69
|
proc.on('error', error => {
|
|
70
|
+
if (settled) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
settled = true;
|
|
66
74
|
reject(new Error(`Failed to spawn ${command}: ${error.message}`));
|
|
67
75
|
});
|
|
68
76
|
|
|
69
77
|
proc.on('close', code => {
|
|
78
|
+
if (settled) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
settled = true;
|
|
70
82
|
if (code !== 0) {
|
|
71
|
-
reject(new Error(`${command} exited with code ${code}
|
|
83
|
+
reject(new Error(`${command} exited with code ${code}`));
|
|
84
|
+
} else if (parseError) {
|
|
85
|
+
reject(parseError);
|
|
72
86
|
} else {
|
|
73
87
|
resolve(result);
|
|
74
88
|
}
|
|
@@ -168,6 +182,9 @@ export function prepareL1ContractsForDeployment(): string {
|
|
|
168
182
|
const foundryTomlPath = join(basePath, 'foundry.toml');
|
|
169
183
|
let foundryToml = readFileSync(foundryTomlPath, 'utf-8');
|
|
170
184
|
const solcPathMatch = foundryToml.match(/solc\s*=\s*"\.\/solc-([^"]+)"/);
|
|
185
|
+
// Did we find a hardcoded solc path that we need to make absolute?
|
|
186
|
+
// This code path happens in CI currently as we bundle solc there to avoid race conditions when
|
|
187
|
+
// downloading solc.
|
|
171
188
|
if (solcPathMatch) {
|
|
172
189
|
const solcVersion = solcPathMatch[1];
|
|
173
190
|
const absoluteSolcPath = join(basePath, `solc-${solcVersion}`);
|
|
@@ -318,11 +335,8 @@ export async function deployAztecL1Contracts(
|
|
|
318
335
|
);
|
|
319
336
|
}
|
|
320
337
|
|
|
321
|
-
|
|
322
|
-
const MAGIC_ANVIL_BATCH_SIZE = 8;
|
|
323
|
-
// Anvil seems to stall with unbounded batch size. Otherwise no max batch size is desirable.
|
|
338
|
+
const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
|
|
324
339
|
const forgeArgs = [
|
|
325
|
-
'script',
|
|
326
340
|
FORGE_SCRIPT,
|
|
327
341
|
'--sig',
|
|
328
342
|
'run()',
|
|
@@ -330,8 +344,6 @@ export async function deployAztecL1Contracts(
|
|
|
330
344
|
privateKey,
|
|
331
345
|
'--rpc-url',
|
|
332
346
|
rpcUrl,
|
|
333
|
-
'--broadcast',
|
|
334
|
-
...(chainId === foundry.id ? ['--batch-size', MAGIC_ANVIL_BATCH_SIZE.toString()] : []),
|
|
335
347
|
...(shouldVerify ? ['--verify'] : []),
|
|
336
348
|
];
|
|
337
349
|
const forgeEnv = {
|
|
@@ -340,7 +352,12 @@ export async function deployAztecL1Contracts(
|
|
|
340
352
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
341
353
|
...getDeployAztecL1ContractsEnvVars(args),
|
|
342
354
|
};
|
|
343
|
-
const result = await runProcess<ForgeL1ContractsDeployResult>(
|
|
355
|
+
const result = await runProcess<ForgeL1ContractsDeployResult>(
|
|
356
|
+
process.execPath,
|
|
357
|
+
[scriptPath, ...forgeArgs],
|
|
358
|
+
forgeEnv,
|
|
359
|
+
l1ContractsPath,
|
|
360
|
+
);
|
|
344
361
|
if (!result) {
|
|
345
362
|
throw new Error('Forge script did not output deployment result');
|
|
346
363
|
}
|
|
@@ -473,7 +490,25 @@ export type VerificationRecord = {
|
|
|
473
490
|
libraries: VerificationLibraryEntry[];
|
|
474
491
|
};
|
|
475
492
|
|
|
476
|
-
export interface DeployAztecL1ContractsArgs
|
|
493
|
+
export interface DeployAztecL1ContractsArgs
|
|
494
|
+
extends Omit<
|
|
495
|
+
L1ContractsConfig,
|
|
496
|
+
| 'gasLimitBufferPercentage'
|
|
497
|
+
| 'maxGwei'
|
|
498
|
+
| 'maxBlobGwei'
|
|
499
|
+
| 'priorityFeeBumpPercentage'
|
|
500
|
+
| 'priorityFeeRetryBumpPercentage'
|
|
501
|
+
| 'minimumPriorityFeePerGas'
|
|
502
|
+
| 'maxSpeedUpAttempts'
|
|
503
|
+
| 'checkIntervalMs'
|
|
504
|
+
| 'stallTimeMs'
|
|
505
|
+
| 'txTimeoutMs'
|
|
506
|
+
| 'cancelTxOnTimeout'
|
|
507
|
+
| 'txCancellationFinalTimeoutMs'
|
|
508
|
+
| 'txUnseenConsideredDroppedMs'
|
|
509
|
+
| 'enableDelayer'
|
|
510
|
+
| 'txDelayerMaxInclusionTimeIntoSlot'
|
|
511
|
+
> {
|
|
477
512
|
/** The vk tree root. */
|
|
478
513
|
vkTreeRoot: Fr;
|
|
479
514
|
/** The hash of the protocol contracts. */
|
|
@@ -583,17 +618,8 @@ export const deployRollupForUpgrade = async (
|
|
|
583
618
|
const FORGE_SCRIPT = 'script/deploy/DeployRollupForUpgrade.s.sol';
|
|
584
619
|
await maybeForgeForceProductionBuild(l1ContractsPath, FORGE_SCRIPT, chainId);
|
|
585
620
|
|
|
586
|
-
const
|
|
587
|
-
|
|
588
|
-
FORGE_SCRIPT,
|
|
589
|
-
'--sig',
|
|
590
|
-
'run()',
|
|
591
|
-
'--private-key',
|
|
592
|
-
privateKey,
|
|
593
|
-
'--rpc-url',
|
|
594
|
-
rpcUrl,
|
|
595
|
-
'--broadcast',
|
|
596
|
-
];
|
|
621
|
+
const scriptPath = join(getL1ContractsPath(), 'scripts', 'forge_broadcast.js');
|
|
622
|
+
const forgeArgs = [FORGE_SCRIPT, '--sig', 'run()', '--private-key', privateKey, '--rpc-url', rpcUrl];
|
|
597
623
|
const forgeEnv = {
|
|
598
624
|
FOUNDRY_PROFILE: chainId === mainnet.id ? 'production' : undefined,
|
|
599
625
|
// Env vars required by l1-contracts/script/deploy/RollupConfiguration.sol.
|
|
@@ -602,7 +628,12 @@ export const deployRollupForUpgrade = async (
|
|
|
602
628
|
...getDeployRollupForUpgradeEnvVars(args),
|
|
603
629
|
};
|
|
604
630
|
|
|
605
|
-
const result = await runProcess<ForgeRollupUpgradeResult>(
|
|
631
|
+
const result = await runProcess<ForgeRollupUpgradeResult>(
|
|
632
|
+
process.execPath,
|
|
633
|
+
[scriptPath, ...forgeArgs],
|
|
634
|
+
forgeEnv,
|
|
635
|
+
l1ContractsPath,
|
|
636
|
+
);
|
|
606
637
|
if (!result) {
|
|
607
638
|
throw new Error('Forge script did not output deployment result');
|
|
608
639
|
}
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from './deploy_aztec_l1_contracts.js';
|
|
25
25
|
import { RegisterNewRollupVersionPayloadArtifact } from './l1_artifacts.js';
|
|
26
26
|
import { type L1TxUtilsConfig, getL1TxUtilsConfigEnvVars } from './l1_tx_utils/config.js';
|
|
27
|
-
import {
|
|
27
|
+
import { createL1TxUtils } from './l1_tx_utils/factory.js';
|
|
28
28
|
import type { L1TxUtils } from './l1_tx_utils/l1_tx_utils.js';
|
|
29
29
|
import type { GasPrice, L1TxConfig, L1TxRequest } from './l1_tx_utils/types.js';
|
|
30
30
|
import type { ExtendedViemWalletClient } from './types.js';
|
|
@@ -46,7 +46,7 @@ export class L1Deployer {
|
|
|
46
46
|
private createVerificationJson: boolean = false,
|
|
47
47
|
) {
|
|
48
48
|
this.salt = maybeSalt ? padHex(numberToHex(maybeSalt), { size: 32 }) : undefined;
|
|
49
|
-
this.l1TxUtils =
|
|
49
|
+
this.l1TxUtils = createL1TxUtils(
|
|
50
50
|
this.client,
|
|
51
51
|
{ logger: this.logger, dateProvider },
|
|
52
52
|
{ ...this.txUtilsConfig, debugMaxGasLimit: acceleratedTestDeployments },
|
|
@@ -179,7 +179,7 @@ export async function deployL1Contract(
|
|
|
179
179
|
|
|
180
180
|
if (!l1TxUtils) {
|
|
181
181
|
const config = getL1TxUtilsConfigEnvVars();
|
|
182
|
-
l1TxUtils =
|
|
182
|
+
l1TxUtils = createL1TxUtils(
|
|
183
183
|
extendedClient,
|
|
184
184
|
{ logger },
|
|
185
185
|
{ ...config, debugMaxGasLimit: acceleratedTestDeployments },
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/** Default L1 contracts configuration values from network-defaults.yml */
|
|
5
5
|
export const l1ContractsDefaultEnv = {
|
|
6
6
|
ETHEREUM_SLOT_DURATION: 12,
|
|
7
|
-
AZTEC_SLOT_DURATION:
|
|
7
|
+
AZTEC_SLOT_DURATION: 72,
|
|
8
8
|
AZTEC_EPOCH_DURATION: 32,
|
|
9
9
|
AZTEC_TARGET_COMMITTEE_SIZE: 48,
|
|
10
10
|
AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET: 2,
|