@aztec/ethereum 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e
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 +22 -33
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +59 -64
- package/dest/contracts/chain_state_override.d.ts +38 -0
- package/dest/contracts/chain_state_override.d.ts.map +1 -0
- package/dest/contracts/chain_state_override.js +100 -0
- package/dest/contracts/empire_base.d.ts +3 -1
- package/dest/contracts/empire_base.d.ts.map +1 -1
- 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 +3 -1
- package/dest/contracts/governance.d.ts.map +1 -1
- package/dest/contracts/governance.js +14 -4
- 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/inbox.d.ts +18 -1
- package/dest/contracts/inbox.d.ts.map +1 -1
- package/dest/contracts/inbox.js +31 -1
- package/dest/contracts/index.d.ts +5 -3
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +4 -2
- package/dest/contracts/log.d.ts +13 -0
- package/dest/contracts/log.d.ts.map +1 -0
- package/dest/contracts/log.js +1 -0
- package/dest/contracts/multicall.d.ts +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 +117 -22
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +370 -60
- package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
- package/dest/contracts/slashing_proposer.d.ts.map +1 -0
- package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +18 -13
- package/dest/deploy_aztec_l1_contracts.d.ts +9 -8
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +58 -32
- package/dest/deploy_l1_contract.js +3 -3
- 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 +10713 -16120
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +9 -24
- package/dest/l1_contract_addresses.d.ts +1 -5
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +0 -6
- 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 +81 -57
- 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/queries.d.ts +2 -2
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +7 -4
- 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 +18 -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/rollup_cheat_codes.d.ts +8 -2
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +19 -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 +8 -9
- package/src/client.ts +10 -2
- package/src/config.ts +75 -65
- package/src/contracts/README.md +157 -0
- package/src/contracts/chain_state_override.ts +147 -0
- package/src/contracts/empire_base.ts +2 -0
- package/src/contracts/fee_asset_handler.ts +2 -0
- package/src/contracts/fee_asset_price_oracle.ts +280 -0
- package/src/contracts/governance.ts +13 -4
- package/src/contracts/governance_proposer.ts +10 -1
- package/src/contracts/inbox.ts +48 -1
- package/src/contracts/index.ts +4 -2
- package/src/contracts/log.ts +13 -0
- package/src/contracts/multicall.ts +70 -3
- package/src/contracts/registry.ts +31 -1
- package/src/contracts/rollup.ts +424 -56
- package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +16 -14
- package/src/deploy_aztec_l1_contracts.ts +81 -40
- package/src/deploy_l1_contract.ts +3 -3
- package/src/generated/l1-contracts-defaults.ts +32 -0
- package/src/l1_artifacts.ts +12 -35
- package/src/l1_contract_addresses.ts +0 -7
- 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 +74 -36
- 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/queries.ts +6 -4
- 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/rollup_cheat_codes.ts +22 -3
- package/src/test/start_anvil.ts +177 -29
- package/src/test/upgrade_utils.ts +2 -2
- package/src/utils.ts +70 -14
- package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
- package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
- package/dest/contracts/empire_slashing_proposer.js +0 -209
- package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
- 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/contracts/empire_slashing_proposer.ts +0 -270
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
- package/src/test/delayed_tx_utils.ts +0 -52
package/dest/contracts/rollup.js
CHANGED
|
@@ -376,24 +376,19 @@ import { Buffer32 } from '@aztec/foundation/buffer';
|
|
|
376
376
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
377
377
|
import { memoize } from '@aztec/foundation/decorators';
|
|
378
378
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
379
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
379
380
|
import { makeBackoff, retry } from '@aztec/foundation/retry';
|
|
381
|
+
import { EscapeHatchAbi } from '@aztec/l1-artifacts/EscapeHatchAbi';
|
|
380
382
|
import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi';
|
|
381
383
|
import { RollupStorage } from '@aztec/l1-artifacts/RollupStorage';
|
|
382
384
|
import chunk from 'lodash.chunk';
|
|
383
|
-
import { encodeFunctionData, getContract, hexToBigInt, keccak256 } from 'viem';
|
|
385
|
+
import { encodeAbiParameters, encodeFunctionData, getContract, hexToBigInt, keccak256 } from 'viem';
|
|
384
386
|
import { getPublicClient } from '../client.js';
|
|
385
387
|
import { formatViemError } from '../utils.js';
|
|
386
|
-
import { EmpireSlashingProposerContract } from './empire_slashing_proposer.js';
|
|
387
388
|
import { GSEContract } from './gse.js';
|
|
388
389
|
import { SlasherContract } from './slasher_contract.js';
|
|
389
|
-
import {
|
|
390
|
+
import { SlashingProposerContract } from './slashing_proposer.js';
|
|
390
391
|
import { checkBlockTag } from './utils.js';
|
|
391
|
-
export var SlashingProposerType = /*#__PURE__*/ function(SlashingProposerType) {
|
|
392
|
-
SlashingProposerType[SlashingProposerType["None"] = 0] = "None";
|
|
393
|
-
SlashingProposerType[SlashingProposerType["Tally"] = 1] = "Tally";
|
|
394
|
-
SlashingProposerType[SlashingProposerType["Empire"] = 2] = "Empire";
|
|
395
|
-
return SlashingProposerType;
|
|
396
|
-
}({});
|
|
397
392
|
/**
|
|
398
393
|
* Status of a validator/attester in the staking system.
|
|
399
394
|
* Matches the Status enum in StakingLib.sol
|
|
@@ -404,6 +399,16 @@ export var SlashingProposerType = /*#__PURE__*/ function(SlashingProposerType) {
|
|
|
404
399
|
AttesterStatus[AttesterStatus["EXITING"] = 3] = "EXITING";
|
|
405
400
|
return AttesterStatus;
|
|
406
401
|
}({});
|
|
402
|
+
/** Field offsets within the CompressedTempCheckpointLog struct in Solidity storage. */ export var TempCheckpointLogField = /*#__PURE__*/ function(TempCheckpointLogField) {
|
|
403
|
+
TempCheckpointLogField[TempCheckpointLogField["HeaderHash"] = 0] = "HeaderHash";
|
|
404
|
+
TempCheckpointLogField[TempCheckpointLogField["BlobCommitmentsHash"] = 1] = "BlobCommitmentsHash";
|
|
405
|
+
TempCheckpointLogField[TempCheckpointLogField["OutHash"] = 2] = "OutHash";
|
|
406
|
+
TempCheckpointLogField[TempCheckpointLogField["AttestationsHash"] = 3] = "AttestationsHash";
|
|
407
|
+
TempCheckpointLogField[TempCheckpointLogField["PayloadDigest"] = 4] = "PayloadDigest";
|
|
408
|
+
TempCheckpointLogField[TempCheckpointLogField["SlotNumber"] = 5] = "SlotNumber";
|
|
409
|
+
TempCheckpointLogField[TempCheckpointLogField["FeeHeader"] = 6] = "FeeHeader";
|
|
410
|
+
return TempCheckpointLogField;
|
|
411
|
+
}({});
|
|
407
412
|
export class RollupContract {
|
|
408
413
|
client;
|
|
409
414
|
static{
|
|
@@ -498,6 +503,16 @@ export class RollupContract {
|
|
|
498
503
|
2,
|
|
499
504
|
"getGenesisArchiveTreeRoot"
|
|
500
505
|
],
|
|
506
|
+
[
|
|
507
|
+
memoize,
|
|
508
|
+
2,
|
|
509
|
+
"getVkTreeRoot"
|
|
510
|
+
],
|
|
511
|
+
[
|
|
512
|
+
memoize,
|
|
513
|
+
2,
|
|
514
|
+
"getProtocolContractsHash"
|
|
515
|
+
],
|
|
501
516
|
[
|
|
502
517
|
memoize,
|
|
503
518
|
2,
|
|
@@ -506,7 +521,9 @@ export class RollupContract {
|
|
|
506
521
|
], []));
|
|
507
522
|
}
|
|
508
523
|
rollup;
|
|
524
|
+
logger;
|
|
509
525
|
static cachedStfStorageSlot;
|
|
526
|
+
cachedEscapeHatch;
|
|
510
527
|
static get checkBlobStorageSlot() {
|
|
511
528
|
const asString = RollupStorage.find((storage)=>storage.label === 'checkBlob')?.slot;
|
|
512
529
|
if (asString === undefined) {
|
|
@@ -528,7 +545,7 @@ export class RollupContract {
|
|
|
528
545
|
}
|
|
529
546
|
constructor(client, address){
|
|
530
547
|
this.client = client;
|
|
531
|
-
_initProto(this);
|
|
548
|
+
this.logger = (_initProto(this), createLogger('ethereum:rollup'));
|
|
532
549
|
if (address instanceof EthAddress) {
|
|
533
550
|
address = address.toString();
|
|
534
551
|
}
|
|
@@ -553,34 +570,10 @@ export class RollupContract {
|
|
|
553
570
|
return undefined;
|
|
554
571
|
}
|
|
555
572
|
const proposerAddress = await slasher.getProposer();
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
type: 'function',
|
|
559
|
-
name: 'SLASHING_PROPOSER_TYPE',
|
|
560
|
-
inputs: [],
|
|
561
|
-
outputs: [
|
|
562
|
-
{
|
|
563
|
-
name: '',
|
|
564
|
-
type: 'uint8',
|
|
565
|
-
internalType: 'enum SlasherFlavor'
|
|
566
|
-
}
|
|
567
|
-
],
|
|
568
|
-
stateMutability: 'view'
|
|
569
|
-
}
|
|
570
|
-
];
|
|
571
|
-
const proposer = getContract({
|
|
572
|
-
address: proposerAddress.toString(),
|
|
573
|
-
abi: proposerAbi,
|
|
574
|
-
client: this.client
|
|
575
|
-
});
|
|
576
|
-
const proposerType = await proposer.read.SLASHING_PROPOSER_TYPE();
|
|
577
|
-
if (proposerType === 1..valueOf()) {
|
|
578
|
-
return new TallySlashingProposerContract(this.client, proposerAddress);
|
|
579
|
-
} else if (proposerType === 2..valueOf()) {
|
|
580
|
-
return new EmpireSlashingProposerContract(this.client, proposerAddress);
|
|
581
|
-
} else {
|
|
582
|
-
throw new Error(`Unknown slashing proposer type: ${proposerType}`);
|
|
573
|
+
if (proposerAddress.isZero()) {
|
|
574
|
+
return undefined;
|
|
583
575
|
}
|
|
576
|
+
return new SlashingProposerContract(this.client, proposerAddress);
|
|
584
577
|
}
|
|
585
578
|
getL1StartBlock() {
|
|
586
579
|
return this.rollup.read.L1_BLOCK_AT_GENESIS();
|
|
@@ -638,30 +631,98 @@ export class RollupContract {
|
|
|
638
631
|
0n
|
|
639
632
|
]));
|
|
640
633
|
}
|
|
634
|
+
async getVkTreeRoot() {
|
|
635
|
+
const slot = BigInt(RollupContract.stfStorageSlot) + 3n;
|
|
636
|
+
const value = await this.client.getStorageAt({
|
|
637
|
+
address: this.address,
|
|
638
|
+
slot: `0x${slot.toString(16)}`
|
|
639
|
+
});
|
|
640
|
+
return Fr.fromString(value ?? '0x0');
|
|
641
|
+
}
|
|
642
|
+
async getProtocolContractsHash() {
|
|
643
|
+
const slot = BigInt(RollupContract.stfStorageSlot) + 4n;
|
|
644
|
+
const value = await this.client.getStorageAt({
|
|
645
|
+
address: this.address,
|
|
646
|
+
slot: `0x${slot.toString(16)}`
|
|
647
|
+
});
|
|
648
|
+
return Fr.fromString(value ?? '0x0');
|
|
649
|
+
}
|
|
641
650
|
/**
|
|
642
651
|
* Returns rollup constants used for epoch queries.
|
|
643
652
|
* Return type is `L1RollupConstants` which is defined in stdlib,
|
|
644
653
|
* so we cant reference it until we move this contract to that package.
|
|
645
654
|
*/ async getRollupConstants() {
|
|
646
|
-
const [l1StartBlock, l1GenesisTime, slotDuration, epochDuration, proofSubmissionEpochs] = await Promise.all([
|
|
655
|
+
const [l1StartBlock, l1GenesisTime, slotDuration, epochDuration, proofSubmissionEpochs, targetCommitteeSize, rollupManaLimit] = await Promise.all([
|
|
647
656
|
this.getL1StartBlock(),
|
|
648
657
|
this.getL1GenesisTime(),
|
|
649
658
|
this.getSlotDuration(),
|
|
650
659
|
this.getEpochDuration(),
|
|
651
|
-
this.getProofSubmissionEpochs()
|
|
660
|
+
this.getProofSubmissionEpochs(),
|
|
661
|
+
this.getTargetCommitteeSize(),
|
|
662
|
+
this.getManaLimit()
|
|
652
663
|
]);
|
|
653
664
|
return {
|
|
654
665
|
l1StartBlock,
|
|
655
666
|
l1GenesisTime,
|
|
656
667
|
slotDuration,
|
|
657
668
|
epochDuration: Number(epochDuration),
|
|
658
|
-
proofSubmissionEpochs: Number(proofSubmissionEpochs)
|
|
669
|
+
proofSubmissionEpochs: Number(proofSubmissionEpochs),
|
|
670
|
+
targetCommitteeSize,
|
|
671
|
+
rollupManaLimit: Number(rollupManaLimit)
|
|
659
672
|
};
|
|
660
673
|
}
|
|
661
674
|
async getSlasherAddress() {
|
|
662
675
|
return EthAddress.fromString(await this.rollup.read.getSlasher());
|
|
663
676
|
}
|
|
664
677
|
/**
|
|
678
|
+
* Returns the configured escape hatch contract address, or zero if disabled.
|
|
679
|
+
*/ async getEscapeHatchAddress() {
|
|
680
|
+
return EthAddress.fromString(await this.rollup.read.getEscapeHatch());
|
|
681
|
+
}
|
|
682
|
+
async getEscapeHatchContract() {
|
|
683
|
+
const escapeHatchAddress = await this.getEscapeHatchAddress();
|
|
684
|
+
if (escapeHatchAddress.isZero()) {
|
|
685
|
+
return undefined;
|
|
686
|
+
}
|
|
687
|
+
// Cache the viem contract wrapper since it will be used frequently.
|
|
688
|
+
if (!this.cachedEscapeHatch || !this.cachedEscapeHatch.address.equals(escapeHatchAddress)) {
|
|
689
|
+
this.cachedEscapeHatch = {
|
|
690
|
+
address: escapeHatchAddress,
|
|
691
|
+
contract: getContract({
|
|
692
|
+
address: escapeHatchAddress.toString(),
|
|
693
|
+
abi: EscapeHatchAbi,
|
|
694
|
+
client: this.client
|
|
695
|
+
})
|
|
696
|
+
};
|
|
697
|
+
}
|
|
698
|
+
return this.cachedEscapeHatch.contract;
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Returns whether the escape hatch is open for the given epoch.
|
|
702
|
+
* If escape hatch is not configured, returns false.
|
|
703
|
+
*
|
|
704
|
+
* This function is intentionally defensive: any failure to query the escape hatch
|
|
705
|
+
* (RPC issues, transient errors, etc.) is treated as "closed" to avoid callers
|
|
706
|
+
* needing to sprinkle try/catch everywhere.
|
|
707
|
+
*/ async isEscapeHatchOpen(epoch) {
|
|
708
|
+
try {
|
|
709
|
+
const escapeHatch = await this.getEscapeHatchContract();
|
|
710
|
+
if (!escapeHatch) {
|
|
711
|
+
return false;
|
|
712
|
+
}
|
|
713
|
+
const [isOpen] = await escapeHatch.read.isHatchOpen([
|
|
714
|
+
BigInt(epoch)
|
|
715
|
+
]);
|
|
716
|
+
return isOpen;
|
|
717
|
+
} catch (err) {
|
|
718
|
+
this.logger.warn('isEscapeHatchOpen failed (treating as closed); RPC or contract error may cause liveness risk', {
|
|
719
|
+
epoch: Number(epoch),
|
|
720
|
+
error: err
|
|
721
|
+
});
|
|
722
|
+
return false;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
665
726
|
* Returns a SlasherContract instance for interacting with the slasher contract.
|
|
666
727
|
*/ async getSlasherContract() {
|
|
667
728
|
const slasherAddress = await this.getSlasherAddress();
|
|
@@ -686,26 +747,42 @@ export class RollupContract {
|
|
|
686
747
|
getCheckpointReward() {
|
|
687
748
|
return this.rollup.read.getCheckpointReward();
|
|
688
749
|
}
|
|
689
|
-
async getCheckpointNumber() {
|
|
690
|
-
|
|
750
|
+
async getCheckpointNumber(options) {
|
|
751
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
752
|
+
return CheckpointNumber.fromBigInt(await this.rollup.read.getPendingCheckpointNumber(options));
|
|
691
753
|
}
|
|
692
|
-
async getProvenCheckpointNumber() {
|
|
693
|
-
|
|
754
|
+
async getProvenCheckpointNumber(options) {
|
|
755
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
756
|
+
return CheckpointNumber.fromBigInt(await this.rollup.read.getProvenCheckpointNumber(options));
|
|
694
757
|
}
|
|
695
|
-
async getSlotNumber() {
|
|
696
|
-
|
|
758
|
+
async getSlotNumber(options) {
|
|
759
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
760
|
+
return SlotNumber.fromBigInt(await this.rollup.read.getCurrentSlot(options));
|
|
697
761
|
}
|
|
698
|
-
async getL1FeesAt(timestamp) {
|
|
762
|
+
async getL1FeesAt(timestamp, options) {
|
|
763
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
699
764
|
const result = await this.rollup.read.getL1FeesAt([
|
|
700
765
|
timestamp
|
|
701
|
-
]);
|
|
766
|
+
], options);
|
|
702
767
|
return {
|
|
703
768
|
baseFee: result.baseFee,
|
|
704
769
|
blobFee: result.blobFee
|
|
705
770
|
};
|
|
706
771
|
}
|
|
707
|
-
|
|
708
|
-
|
|
772
|
+
async getFeeHeader(checkpointNumber) {
|
|
773
|
+
const result = await this.rollup.read.getFeeHeader([
|
|
774
|
+
checkpointNumber
|
|
775
|
+
]);
|
|
776
|
+
return {
|
|
777
|
+
excessMana: result.excessMana,
|
|
778
|
+
manaUsed: result.manaUsed,
|
|
779
|
+
ethPerFeeAsset: result.ethPerFeeAsset,
|
|
780
|
+
congestionCost: result.congestionCost,
|
|
781
|
+
proverCost: result.proverCost
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
getEthPerFeeAsset() {
|
|
785
|
+
return this.rollup.read.getEthPerFeeAsset();
|
|
709
786
|
}
|
|
710
787
|
async getCommitteeAt(timestamp) {
|
|
711
788
|
const { result } = await this.client.simulateContract({
|
|
@@ -772,10 +849,11 @@ export class RollupContract {
|
|
|
772
849
|
});
|
|
773
850
|
return EthAddress.fromString(result);
|
|
774
851
|
}
|
|
775
|
-
async getCheckpoint(checkpointNumber) {
|
|
852
|
+
async getCheckpoint(checkpointNumber, options) {
|
|
853
|
+
await checkBlockTag(options?.blockNumber, this.client);
|
|
776
854
|
const result = await this.rollup.read.getCheckpoint([
|
|
777
855
|
BigInt(checkpointNumber)
|
|
778
|
-
]);
|
|
856
|
+
], options);
|
|
779
857
|
return {
|
|
780
858
|
archive: Fr.fromString(result.archive),
|
|
781
859
|
headerHash: Buffer32.fromString(result.headerHash),
|
|
@@ -786,7 +864,7 @@ export class RollupContract {
|
|
|
786
864
|
feeHeader: {
|
|
787
865
|
excessMana: result.feeHeader.excessMana,
|
|
788
866
|
manaUsed: result.feeHeader.manaUsed,
|
|
789
|
-
|
|
867
|
+
ethPerFeeAsset: result.feeHeader.ethPerFeeAsset,
|
|
790
868
|
congestionCost: result.feeHeader.congestionCost,
|
|
791
869
|
proverCost: result.feeHeader.proverCost
|
|
792
870
|
}
|
|
@@ -805,6 +883,28 @@ export class RollupContract {
|
|
|
805
883
|
0.5
|
|
806
884
|
]));
|
|
807
885
|
}
|
|
886
|
+
/**
|
|
887
|
+
* Returns the effective pending checkpoint, accounting for potential prunes.
|
|
888
|
+
* When a prune can happen, the L1 contract uses the proven checkpoint instead of the pending one.
|
|
889
|
+
* This mirrors the behavior of getEffectivePendingCheckpointNumber in STFLib.sol.
|
|
890
|
+
* @param atTimestamp - The timestamp to evaluate pruneability at. Defaults to the current L1 block timestamp.
|
|
891
|
+
* @param options - Optional L1 block number to pin the queries to.
|
|
892
|
+
*/ getEffectivePendingCheckpoint(atTimestamp, options) {
|
|
893
|
+
return retry(async ()=>{
|
|
894
|
+
const timestamp = atTimestamp ?? (await this.client.getBlock()).timestamp;
|
|
895
|
+
const canPrune = await this.canPruneAtTime(timestamp, options);
|
|
896
|
+
if (canPrune) {
|
|
897
|
+
const provenCheckpointNumber = await this.getProvenCheckpointNumber(options);
|
|
898
|
+
return await this.getCheckpoint(provenCheckpointNumber, options);
|
|
899
|
+
}
|
|
900
|
+
const pendingCheckpointNumber = await this.getCheckpointNumber(options);
|
|
901
|
+
return await this.getCheckpoint(pendingCheckpointNumber, options);
|
|
902
|
+
}, 'getting effective pending checkpoint', makeBackoff([
|
|
903
|
+
0.5,
|
|
904
|
+
0.5,
|
|
905
|
+
0.5
|
|
906
|
+
]));
|
|
907
|
+
}
|
|
808
908
|
async getTips() {
|
|
809
909
|
const { pending, proven } = await this.rollup.read.getTips();
|
|
810
910
|
return {
|
|
@@ -889,9 +989,8 @@ export class RollupContract {
|
|
|
889
989
|
* @return [slot, checkpointNumber, timeOfNextL1Slot] - If you can propose, the L2 slot number, checkpoint number and
|
|
890
990
|
* timestamp of the next L1 block
|
|
891
991
|
* @throws otherwise
|
|
892
|
-
*/ async
|
|
893
|
-
const
|
|
894
|
-
const timeOfNextL1Slot = latestBlock.timestamp + BigInt(slotDuration);
|
|
992
|
+
*/ async canProposeAt(archive, account, timestamp, stateOverride = []) {
|
|
993
|
+
const timeOfNextL1Slot = timestamp;
|
|
895
994
|
const who = typeof account === 'string' ? account : account.address;
|
|
896
995
|
try {
|
|
897
996
|
const { result: [slot, checkpointNumber] } = await this.client.simulateContract({
|
|
@@ -904,7 +1003,7 @@ export class RollupContract {
|
|
|
904
1003
|
who
|
|
905
1004
|
],
|
|
906
1005
|
account,
|
|
907
|
-
stateOverride
|
|
1006
|
+
stateOverride
|
|
908
1007
|
});
|
|
909
1008
|
return {
|
|
910
1009
|
slot: SlotNumber.fromBigInt(slot),
|
|
@@ -942,9 +1041,143 @@ export class RollupContract {
|
|
|
942
1041
|
}
|
|
943
1042
|
];
|
|
944
1043
|
}
|
|
1044
|
+
/**
|
|
1045
|
+
* Returns a state override that sets tempCheckpointLogs[checkpointNumber].feeHeader to the compressed fee header.
|
|
1046
|
+
* Used when simulating a propose call where the parent checkpoint hasn't landed on L1 yet (pipelining).
|
|
1047
|
+
*/ async makeFeeHeaderOverride(checkpointNumber, feeHeader) {
|
|
1048
|
+
const { epochDuration, proofSubmissionEpochs } = await this.getRollupConstants();
|
|
1049
|
+
const roundaboutSize = BigInt(epochDuration * (proofSubmissionEpochs + 1) + 1);
|
|
1050
|
+
const circularIndex = BigInt(checkpointNumber) % roundaboutSize;
|
|
1051
|
+
// tempCheckpointLogs is at offset 2 in RollupStore
|
|
1052
|
+
const tempCheckpointLogsMappingBase = hexToBigInt(RollupContract.stfStorageSlot) + 2n;
|
|
1053
|
+
// Solidity mapping slot: keccak256(abi.encode(key, baseSlot))
|
|
1054
|
+
const structBaseSlot = hexToBigInt(keccak256(encodeAbiParameters([
|
|
1055
|
+
{
|
|
1056
|
+
type: 'uint256'
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
type: 'uint256'
|
|
1060
|
+
}
|
|
1061
|
+
], [
|
|
1062
|
+
circularIndex,
|
|
1063
|
+
tempCheckpointLogsMappingBase
|
|
1064
|
+
])));
|
|
1065
|
+
// feeHeader is the 7th field (offset 6) in CompressedTempCheckpointLog
|
|
1066
|
+
const feeHeaderSlot = structBaseSlot + 6n;
|
|
1067
|
+
const compressed = RollupContract.compressFeeHeader(feeHeader);
|
|
1068
|
+
return [
|
|
1069
|
+
{
|
|
1070
|
+
address: this.address,
|
|
1071
|
+
stateDiff: [
|
|
1072
|
+
{
|
|
1073
|
+
slot: `0x${feeHeaderSlot.toString(16).padStart(64, '0')}`,
|
|
1074
|
+
value: `0x${compressed.toString(16).padStart(64, '0')}`
|
|
1075
|
+
}
|
|
1076
|
+
]
|
|
1077
|
+
}
|
|
1078
|
+
];
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Returns a state override that sets archives[checkpointNumber] to the given archive value.
|
|
1082
|
+
* Used when simulating a canProposeAtTime call where the local archive differs from L1
|
|
1083
|
+
* (e.g. pipelining where the parent checkpoint hasn't landed on L1 yet).
|
|
1084
|
+
*/ makeArchiveOverride(checkpointNumber, archive) {
|
|
1085
|
+
const archivesMappingBase = hexToBigInt(RollupContract.stfStorageSlot) + 1n;
|
|
1086
|
+
const archiveSlot = hexToBigInt(keccak256(encodeAbiParameters([
|
|
1087
|
+
{
|
|
1088
|
+
type: 'uint256'
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
type: 'uint256'
|
|
1092
|
+
}
|
|
1093
|
+
], [
|
|
1094
|
+
BigInt(checkpointNumber),
|
|
1095
|
+
archivesMappingBase
|
|
1096
|
+
])));
|
|
1097
|
+
return [
|
|
1098
|
+
{
|
|
1099
|
+
address: this.address,
|
|
1100
|
+
stateDiff: [
|
|
1101
|
+
{
|
|
1102
|
+
slot: `0x${archiveSlot.toString(16).padStart(64, '0')}`,
|
|
1103
|
+
value: archive.toString()
|
|
1104
|
+
}
|
|
1105
|
+
]
|
|
1106
|
+
}
|
|
1107
|
+
];
|
|
1108
|
+
}
|
|
1109
|
+
/** Merges multiple StateOverride arrays, combining stateDiff entries for the same address. */ static mergeStateOverrides(...overrides) {
|
|
1110
|
+
const byAddress = new Map();
|
|
1111
|
+
for (const override of overrides){
|
|
1112
|
+
for (const entry of override){
|
|
1113
|
+
const key = entry.address.toLowerCase();
|
|
1114
|
+
const existing = byAddress.get(key);
|
|
1115
|
+
if (existing) {
|
|
1116
|
+
existing.stateDiff.push(...entry.stateDiff ?? []);
|
|
1117
|
+
if (entry.balance !== undefined) {
|
|
1118
|
+
existing.balance = entry.balance;
|
|
1119
|
+
}
|
|
1120
|
+
} else {
|
|
1121
|
+
byAddress.set(key, {
|
|
1122
|
+
address: entry.address,
|
|
1123
|
+
balance: entry.balance,
|
|
1124
|
+
stateDiff: [
|
|
1125
|
+
...entry.stateDiff ?? []
|
|
1126
|
+
]
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
return [
|
|
1132
|
+
...byAddress.values()
|
|
1133
|
+
];
|
|
1134
|
+
}
|
|
1135
|
+
/** Compresses a FeeHeader into a uint256 matching FeeHeaderLib.compress() in FeeStructs.sol. */ static compressFeeHeader(feeHeader) {
|
|
1136
|
+
const MASK_48_BITS = (1n << 48n) - 1n;
|
|
1137
|
+
const MASK_64_BITS = (1n << 64n) - 1n;
|
|
1138
|
+
const MASK_63_BITS = (1n << 63n) - 1n;
|
|
1139
|
+
let value = BigInt(feeHeader.manaUsed) & (1n << 32n) - 1n; // bits [0:31]
|
|
1140
|
+
value |= (feeHeader.excessMana < MASK_48_BITS ? feeHeader.excessMana : MASK_48_BITS) << 32n; // bits [32:79]
|
|
1141
|
+
value |= (BigInt(feeHeader.ethPerFeeAsset) & MASK_48_BITS) << 80n; // bits [80:127]
|
|
1142
|
+
value |= (feeHeader.congestionCost < MASK_64_BITS ? feeHeader.congestionCost : MASK_64_BITS) << 128n; // bits [128:191]
|
|
1143
|
+
value |= (feeHeader.proverCost < MASK_63_BITS ? feeHeader.proverCost : MASK_63_BITS) << 192n; // bits [192:254]
|
|
1144
|
+
value |= 1n << 255n; // preheat flag
|
|
1145
|
+
return value;
|
|
1146
|
+
}
|
|
1147
|
+
/** Computes the fee header for a child checkpoint given parent fee header and child data.
|
|
1148
|
+
* Must stay in sync with Solidity FeeLib.sol (computeNewEthPerFeeAsset, clampedAdd). */ static computeChildFeeHeader(parentFeeHeader, childManaUsed, feeAssetPriceModifier, manaTarget) {
|
|
1149
|
+
const MIN_ETH_PER_FEE_ASSET = 100n;
|
|
1150
|
+
const MAX_ETH_PER_FEE_ASSET = 100_000_000_000_000n; // 1e14, matches FeeLib.sol
|
|
1151
|
+
// excessMana = clampedAdd(parent.excessMana + parent.manaUsed, -manaTarget)
|
|
1152
|
+
const sum = parentFeeHeader.excessMana + parentFeeHeader.manaUsed;
|
|
1153
|
+
const excessMana = sum > manaTarget ? sum - manaTarget : 0n;
|
|
1154
|
+
// ethPerFeeAsset = computeNewEthPerFeeAsset(max(parent.ethPerFeeAsset, MIN), modifier)
|
|
1155
|
+
const parentPrice = parentFeeHeader.ethPerFeeAsset > MIN_ETH_PER_FEE_ASSET ? parentFeeHeader.ethPerFeeAsset : MIN_ETH_PER_FEE_ASSET;
|
|
1156
|
+
let newPrice;
|
|
1157
|
+
if (feeAssetPriceModifier >= 0n) {
|
|
1158
|
+
newPrice = parentPrice * (10_000n + feeAssetPriceModifier) / 10_000n;
|
|
1159
|
+
} else {
|
|
1160
|
+
const absMod = -feeAssetPriceModifier;
|
|
1161
|
+
newPrice = parentPrice * (10_000n - absMod) / 10_000n;
|
|
1162
|
+
}
|
|
1163
|
+
if (newPrice < MIN_ETH_PER_FEE_ASSET) {
|
|
1164
|
+
newPrice = MIN_ETH_PER_FEE_ASSET;
|
|
1165
|
+
}
|
|
1166
|
+
if (newPrice > MAX_ETH_PER_FEE_ASSET) {
|
|
1167
|
+
newPrice = MAX_ETH_PER_FEE_ASSET;
|
|
1168
|
+
}
|
|
1169
|
+
return {
|
|
1170
|
+
excessMana,
|
|
1171
|
+
manaUsed: childManaUsed,
|
|
1172
|
+
ethPerFeeAsset: newPrice,
|
|
1173
|
+
congestionCost: 0n,
|
|
1174
|
+
proverCost: 0n
|
|
1175
|
+
};
|
|
1176
|
+
}
|
|
945
1177
|
/** Creates a request to Rollup#invalidateBadAttestation to be simulated or sent */ buildInvalidateBadAttestationRequest(checkpointNumber, attestationsAndSigners, committee, invalidIndex) {
|
|
946
1178
|
return {
|
|
947
1179
|
to: this.address,
|
|
1180
|
+
abi: RollupAbi,
|
|
948
1181
|
data: encodeFunctionData({
|
|
949
1182
|
abi: RollupAbi,
|
|
950
1183
|
functionName: 'invalidateBadAttestation',
|
|
@@ -960,6 +1193,7 @@ export class RollupContract {
|
|
|
960
1193
|
/** Creates a request to Rollup#invalidateInsufficientAttestations to be simulated or sent */ buildInvalidateInsufficientAttestationsRequest(checkpointNumber, attestationsAndSigners, committee) {
|
|
961
1194
|
return {
|
|
962
1195
|
to: this.address,
|
|
1196
|
+
abi: RollupAbi,
|
|
963
1197
|
data: encodeFunctionData({
|
|
964
1198
|
abi: RollupAbi,
|
|
965
1199
|
functionName: 'invalidateInsufficientAttestations',
|
|
@@ -981,11 +1215,25 @@ export class RollupContract {
|
|
|
981
1215
|
prover
|
|
982
1216
|
]);
|
|
983
1217
|
}
|
|
984
|
-
getManaMinFeeAt(timestamp, inFeeAsset) {
|
|
1218
|
+
getManaMinFeeAt(timestamp, inFeeAsset, stateOverride) {
|
|
985
1219
|
return this.rollup.read.getManaMinFeeAt([
|
|
986
1220
|
timestamp,
|
|
987
1221
|
inFeeAsset
|
|
1222
|
+
], {
|
|
1223
|
+
stateOverride
|
|
1224
|
+
});
|
|
1225
|
+
}
|
|
1226
|
+
async getManaMinFeeComponentsAt(timestamp, inFeeAsset) {
|
|
1227
|
+
const result = await this.rollup.read.getManaMinFeeComponentsAt([
|
|
1228
|
+
timestamp,
|
|
1229
|
+
inFeeAsset
|
|
988
1230
|
]);
|
|
1231
|
+
return {
|
|
1232
|
+
sequencerCost: result.sequencerCost,
|
|
1233
|
+
proverCost: result.proverCost,
|
|
1234
|
+
congestionCost: result.congestionCost,
|
|
1235
|
+
congestionMultiplier: result.congestionMultiplier
|
|
1236
|
+
};
|
|
989
1237
|
}
|
|
990
1238
|
async getSlotAt(timestamp) {
|
|
991
1239
|
return SlotNumber.fromBigInt(await this.rollup.read.getSlotAt([
|
|
@@ -1036,10 +1284,10 @@ export class RollupContract {
|
|
|
1036
1284
|
prover
|
|
1037
1285
|
]);
|
|
1038
1286
|
}
|
|
1039
|
-
async getAttesters() {
|
|
1287
|
+
async getAttesters(timestamp) {
|
|
1040
1288
|
const attesterSize = await this.getActiveAttesterCount();
|
|
1041
1289
|
const gse = new GSEContract(this.client, await this.getGSE());
|
|
1042
|
-
const ts = (await this.client.getBlock()).timestamp;
|
|
1290
|
+
const ts = timestamp ?? (await this.client.getBlock()).timestamp;
|
|
1043
1291
|
const indices = Array.from({
|
|
1044
1292
|
length: attesterSize
|
|
1045
1293
|
}, (_, i)=>BigInt(i));
|
|
@@ -1105,6 +1353,7 @@ export class RollupContract {
|
|
|
1105
1353
|
setupEpoch(l1TxUtils) {
|
|
1106
1354
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
1107
1355
|
to: this.address,
|
|
1356
|
+
abi: RollupAbi,
|
|
1108
1357
|
data: encodeFunctionData({
|
|
1109
1358
|
abi: RollupAbi,
|
|
1110
1359
|
functionName: 'setupEpoch',
|
|
@@ -1115,6 +1364,7 @@ export class RollupContract {
|
|
|
1115
1364
|
vote(l1TxUtils, proposalId) {
|
|
1116
1365
|
return l1TxUtils.sendAndMonitorTransaction({
|
|
1117
1366
|
to: this.address,
|
|
1367
|
+
abi: RollupAbi,
|
|
1118
1368
|
data: encodeFunctionData({
|
|
1119
1369
|
abi: RollupAbi,
|
|
1120
1370
|
functionName: 'vote',
|
|
@@ -1174,4 +1424,64 @@ export class RollupContract {
|
|
|
1174
1424
|
}
|
|
1175
1425
|
});
|
|
1176
1426
|
}
|
|
1427
|
+
/** Fetches CheckpointProposed events within the given block range. */ async getCheckpointProposedEvents(fromBlock, toBlock) {
|
|
1428
|
+
const logs = await this.rollup.getEvents.CheckpointProposed({}, {
|
|
1429
|
+
fromBlock,
|
|
1430
|
+
toBlock
|
|
1431
|
+
});
|
|
1432
|
+
return logs.filter((log)=>log.blockNumber >= fromBlock && log.blockNumber <= toBlock).map((log)=>({
|
|
1433
|
+
l1BlockNumber: log.blockNumber,
|
|
1434
|
+
l1BlockHash: Buffer32.fromString(log.blockHash),
|
|
1435
|
+
l1TransactionHash: log.transactionHash,
|
|
1436
|
+
args: {
|
|
1437
|
+
checkpointNumber: CheckpointNumber.fromBigInt(log.args.checkpointNumber),
|
|
1438
|
+
archive: Fr.fromString(log.args.archive),
|
|
1439
|
+
versionedBlobHashes: log.args.versionedBlobHashes.map((h)=>Buffer.from(h.slice(2), 'hex')),
|
|
1440
|
+
attestationsHash: (()=>{
|
|
1441
|
+
if (!log.args.attestationsHash) {
|
|
1442
|
+
throw new Error(`CheckpointProposed event missing attestationsHash for checkpoint ${log.args.checkpointNumber}`);
|
|
1443
|
+
}
|
|
1444
|
+
return Buffer32.fromString(log.args.attestationsHash);
|
|
1445
|
+
})(),
|
|
1446
|
+
payloadDigest: (()=>{
|
|
1447
|
+
if (!log.args.payloadDigest) {
|
|
1448
|
+
throw new Error(`CheckpointProposed event missing payloadDigest for checkpoint ${log.args.checkpointNumber}`);
|
|
1449
|
+
}
|
|
1450
|
+
return Buffer32.fromString(log.args.payloadDigest);
|
|
1451
|
+
})()
|
|
1452
|
+
}
|
|
1453
|
+
}));
|
|
1454
|
+
}
|
|
1455
|
+
/** Packs pending and proven checkpoint numbers into the chain tips storage format. */ static packChainTips(pendingCheckpointNumber, provenCheckpointNumber) {
|
|
1456
|
+
return pendingCheckpointNumber << 128n | provenCheckpointNumber & (1n << 128n) - 1n;
|
|
1457
|
+
}
|
|
1458
|
+
/** Storage slot for the chain tips (offset 0 within the STF storage struct). */ static get chainTipsStorageSlot() {
|
|
1459
|
+
return BigInt(RollupContract.stfStorageSlot);
|
|
1460
|
+
}
|
|
1461
|
+
/**
|
|
1462
|
+
* Computes the storage slot for a field within a tempCheckpointLog entry.
|
|
1463
|
+
* @param checkpointNumber - The checkpoint number
|
|
1464
|
+
* @param field - The field within the CompressedTempCheckpointLog struct
|
|
1465
|
+
*/ async getTempCheckpointLogStorageSlot(checkpointNumber, field) {
|
|
1466
|
+
const fieldOffset = BigInt(field);
|
|
1467
|
+
const [epochDuration, proofSubmissionEpochs] = await Promise.all([
|
|
1468
|
+
this.getEpochDuration(),
|
|
1469
|
+
this.getProofSubmissionEpochs()
|
|
1470
|
+
]);
|
|
1471
|
+
const roundaboutSize = BigInt(epochDuration) * (BigInt(proofSubmissionEpochs) + 1n) + 1n;
|
|
1472
|
+
const tempCheckpointLogsBase = BigInt(RollupContract.stfStorageSlot) + 2n;
|
|
1473
|
+
const circularIndex = BigInt(checkpointNumber) % roundaboutSize;
|
|
1474
|
+
const entryBase = BigInt(keccak256(encodeAbiParameters([
|
|
1475
|
+
{
|
|
1476
|
+
type: 'uint256'
|
|
1477
|
+
},
|
|
1478
|
+
{
|
|
1479
|
+
type: 'uint256'
|
|
1480
|
+
}
|
|
1481
|
+
], [
|
|
1482
|
+
circularIndex,
|
|
1483
|
+
tempCheckpointLogsBase
|
|
1484
|
+
])));
|
|
1485
|
+
return entryBase + fieldOffset;
|
|
1486
|
+
}
|
|
1177
1487
|
}
|
|
@@ -5,13 +5,12 @@ import { Buffer32 } from '@aztec/foundation/buffer';
|
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
import { type Hex, type Log, type TypedDataDefinition } from 'viem';
|
|
7
7
|
/**
|
|
8
|
-
* Wrapper around the
|
|
8
|
+
* Wrapper around the SlashingProposer contract that provides
|
|
9
9
|
* a TypeScript interface for interacting with the consensus-based slashing system.
|
|
10
10
|
*/
|
|
11
|
-
export declare class
|
|
11
|
+
export declare class SlashingProposerContract {
|
|
12
12
|
readonly client: ViemClient;
|
|
13
13
|
private readonly contract;
|
|
14
|
-
readonly type: "tally";
|
|
15
14
|
constructor(client: ViemClient, address: Hex | EthAddress);
|
|
16
15
|
get address(): EthAddress;
|
|
17
16
|
getQuorumSize(): Promise<bigint>;
|
|
@@ -137,4 +136,4 @@ export declare class TallySlashingProposerContract {
|
|
|
137
136
|
* @returns An array of numbers representing the slash votes
|
|
138
137
|
*/
|
|
139
138
|
export declare function decodeSlashConsensusVotes(buffer: Buffer): number[];
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hpbmdfcHJvcG9zZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvc2xhc2hpbmdfcHJvcG9zZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNM0QsT0FBTyxFQUVMLEtBQUssR0FBRyxFQUNSLEtBQUssR0FBRyxFQUNSLEtBQUssbUJBQW1CLEVBR3pCLE1BQU0sTUFBTSxDQUFDO0FBRWQ7OztHQUdHO0FBQ0gscUJBQWEsd0JBQXdCO2FBSWpCLE1BQU0sRUFBRSxVQUFVO0lBSHBDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFnRTtJQUV6RixZQUNrQixNQUFNLEVBQUUsVUFBVSxFQUNsQyxPQUFPLEVBQUUsR0FBRyxHQUFHLFVBQVUsRUFPMUI7SUFFRCxJQUFXLE9BQU8sZUFFakI7SUFFTSxhQUFhLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUV0QztJQUVNLFlBQVksSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBRXJDO0lBRU0sZ0JBQWdCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUV6QztJQUVNLG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFN0M7SUFFTSxtQkFBbUIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBRTVDO0lBRU0seUJBQXlCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUVsRDtJQUVNLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxDQUFD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slashing_proposer.d.ts","sourceRoot":"","sources":["../../src/contracts/slashing_proposer.ts"],"names":[],"mappings":"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"}
|