@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.
Files changed (171) hide show
  1. package/dest/client.d.ts +10 -2
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +13 -7
  4. package/dest/config.d.ts +22 -33
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +59 -64
  7. package/dest/contracts/chain_state_override.d.ts +38 -0
  8. package/dest/contracts/chain_state_override.d.ts.map +1 -0
  9. package/dest/contracts/chain_state_override.js +100 -0
  10. package/dest/contracts/empire_base.d.ts +3 -1
  11. package/dest/contracts/empire_base.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_handler.d.ts +1 -1
  13. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  14. package/dest/contracts/fee_asset_handler.js +2 -0
  15. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  16. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  17. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  18. package/dest/contracts/governance.d.ts +3 -1
  19. package/dest/contracts/governance.d.ts.map +1 -1
  20. package/dest/contracts/governance.js +14 -4
  21. package/dest/contracts/governance_proposer.d.ts +3 -1
  22. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  23. package/dest/contracts/governance_proposer.js +13 -1
  24. package/dest/contracts/inbox.d.ts +18 -1
  25. package/dest/contracts/inbox.d.ts.map +1 -1
  26. package/dest/contracts/inbox.js +31 -1
  27. package/dest/contracts/index.d.ts +5 -3
  28. package/dest/contracts/index.d.ts.map +1 -1
  29. package/dest/contracts/index.js +4 -2
  30. package/dest/contracts/log.d.ts +13 -0
  31. package/dest/contracts/log.d.ts.map +1 -0
  32. package/dest/contracts/log.js +1 -0
  33. package/dest/contracts/multicall.d.ts +51 -2
  34. package/dest/contracts/multicall.d.ts.map +1 -1
  35. package/dest/contracts/multicall.js +87 -1
  36. package/dest/contracts/registry.d.ts +3 -1
  37. package/dest/contracts/registry.d.ts.map +1 -1
  38. package/dest/contracts/registry.js +30 -1
  39. package/dest/contracts/rollup.d.ts +117 -22
  40. package/dest/contracts/rollup.d.ts.map +1 -1
  41. package/dest/contracts/rollup.js +370 -60
  42. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  43. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  44. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +18 -13
  45. package/dest/deploy_aztec_l1_contracts.d.ts +9 -8
  46. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  47. package/dest/deploy_aztec_l1_contracts.js +58 -32
  48. package/dest/deploy_l1_contract.js +3 -3
  49. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  50. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  51. package/dest/generated/l1-contracts-defaults.js +30 -0
  52. package/dest/l1_artifacts.d.ts +10713 -16120
  53. package/dest/l1_artifacts.d.ts.map +1 -1
  54. package/dest/l1_artifacts.js +9 -24
  55. package/dest/l1_contract_addresses.d.ts +1 -5
  56. package/dest/l1_contract_addresses.d.ts.map +1 -1
  57. package/dest/l1_contract_addresses.js +0 -6
  58. package/dest/l1_reader.d.ts +3 -1
  59. package/dest/l1_reader.d.ts.map +1 -1
  60. package/dest/l1_reader.js +6 -1
  61. package/dest/l1_tx_utils/config.d.ts +7 -1
  62. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  63. package/dest/l1_tx_utils/config.js +14 -1
  64. package/dest/l1_tx_utils/constants.d.ts +1 -1
  65. package/dest/l1_tx_utils/constants.js +2 -2
  66. package/dest/l1_tx_utils/factory.d.ts +18 -10
  67. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  68. package/dest/l1_tx_utils/factory.js +17 -7
  69. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
  70. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
  71. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  72. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  73. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  74. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  75. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  76. package/dest/l1_tx_utils/index-blobs.js +2 -2
  77. package/dest/l1_tx_utils/index.d.ts +2 -1
  78. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  79. package/dest/l1_tx_utils/index.js +1 -0
  80. package/dest/l1_tx_utils/l1_tx_utils.d.ts +20 -7
  81. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  82. package/dest/l1_tx_utils/l1_tx_utils.js +81 -57
  83. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  84. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  85. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +11 -7
  86. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  87. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  88. package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
  89. package/dest/publisher_manager.d.ts +21 -6
  90. package/dest/publisher_manager.d.ts.map +1 -1
  91. package/dest/publisher_manager.js +81 -7
  92. package/dest/queries.d.ts +2 -2
  93. package/dest/queries.d.ts.map +1 -1
  94. package/dest/queries.js +7 -4
  95. package/dest/test/chain_monitor.d.ts +22 -3
  96. package/dest/test/chain_monitor.d.ts.map +1 -1
  97. package/dest/test/chain_monitor.js +33 -2
  98. package/dest/test/eth_cheat_codes.d.ts +18 -4
  99. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  100. package/dest/test/eth_cheat_codes.js +6 -4
  101. package/dest/test/index.d.ts +1 -3
  102. package/dest/test/index.d.ts.map +1 -1
  103. package/dest/test/index.js +0 -2
  104. package/dest/test/rollup_cheat_codes.d.ts +8 -2
  105. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  106. package/dest/test/rollup_cheat_codes.js +19 -2
  107. package/dest/test/start_anvil.d.ts +23 -3
  108. package/dest/test/start_anvil.d.ts.map +1 -1
  109. package/dest/test/start_anvil.js +143 -29
  110. package/dest/test/upgrade_utils.js +2 -2
  111. package/dest/utils.d.ts +2 -1
  112. package/dest/utils.d.ts.map +1 -1
  113. package/dest/utils.js +62 -12
  114. package/package.json +8 -9
  115. package/src/client.ts +10 -2
  116. package/src/config.ts +75 -65
  117. package/src/contracts/README.md +157 -0
  118. package/src/contracts/chain_state_override.ts +147 -0
  119. package/src/contracts/empire_base.ts +2 -0
  120. package/src/contracts/fee_asset_handler.ts +2 -0
  121. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  122. package/src/contracts/governance.ts +13 -4
  123. package/src/contracts/governance_proposer.ts +10 -1
  124. package/src/contracts/inbox.ts +48 -1
  125. package/src/contracts/index.ts +4 -2
  126. package/src/contracts/log.ts +13 -0
  127. package/src/contracts/multicall.ts +70 -3
  128. package/src/contracts/registry.ts +31 -1
  129. package/src/contracts/rollup.ts +424 -56
  130. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +16 -14
  131. package/src/deploy_aztec_l1_contracts.ts +81 -40
  132. package/src/deploy_l1_contract.ts +3 -3
  133. package/src/generated/l1-contracts-defaults.ts +32 -0
  134. package/src/l1_artifacts.ts +12 -35
  135. package/src/l1_contract_addresses.ts +0 -7
  136. package/src/l1_reader.ts +13 -1
  137. package/src/l1_tx_utils/config.ts +20 -0
  138. package/src/l1_tx_utils/constants.ts +2 -2
  139. package/src/l1_tx_utils/factory.ts +31 -31
  140. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
  141. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
  142. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  143. package/src/l1_tx_utils/index-blobs.ts +2 -2
  144. package/src/l1_tx_utils/index.ts +1 -0
  145. package/src/l1_tx_utils/l1_tx_utils.ts +74 -36
  146. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +11 -7
  147. package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
  148. package/src/publisher_manager.ts +107 -10
  149. package/src/queries.ts +6 -4
  150. package/src/test/chain_monitor.ts +60 -3
  151. package/src/test/eth_cheat_codes.ts +6 -4
  152. package/src/test/index.ts +0 -2
  153. package/src/test/rollup_cheat_codes.ts +22 -3
  154. package/src/test/start_anvil.ts +177 -29
  155. package/src/test/upgrade_utils.ts +2 -2
  156. package/src/utils.ts +70 -14
  157. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  158. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  159. package/dest/contracts/empire_slashing_proposer.js +0 -209
  160. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  161. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  162. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  163. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  164. package/dest/test/delayed_tx_utils.d.ts +0 -13
  165. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  166. package/dest/test/delayed_tx_utils.js +0 -28
  167. package/dest/test/tx_delayer.d.ts +0 -36
  168. package/dest/test/tx_delayer.d.ts.map +0 -1
  169. package/src/contracts/empire_slashing_proposer.ts +0 -270
  170. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  171. package/src/test/delayed_tx_utils.ts +0 -52
@@ -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 { TallySlashingProposerContract } from './tally_slashing_proposer.js';
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
- const proposerAbi = [
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
- return CheckpointNumber.fromBigInt(await this.rollup.read.getPendingCheckpointNumber());
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
- return CheckpointNumber.fromBigInt(await this.rollup.read.getProvenCheckpointNumber());
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
- return SlotNumber.fromBigInt(await this.rollup.read.getCurrentSlot());
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
- getFeeAssetPerEth() {
708
- return this.rollup.read.getFeeAssetPerEth();
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
- feeAssetPriceNumerator: result.feeHeader.feeAssetPriceNumerator,
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 canProposeAtNextEthBlock(archive, account, slotDuration, opts = {}) {
893
- const latestBlock = await this.client.getBlock();
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: await this.makePendingCheckpointNumberOverride(opts.forcePendingCheckpointNumber)
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 TallySlashingProposer contract that provides
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 TallySlashingProposerContract {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFsbHlfc2xhc2hpbmdfcHJvcG9zZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvdGFsbHlfc2xhc2hpbmdfcHJvcG9zZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFLM0QsT0FBTyxFQUVMLEtBQUssR0FBRyxFQUNSLEtBQUssR0FBRyxFQUNSLEtBQUssbUJBQW1CLEVBR3pCLE1BQU0sTUFBTSxDQUFDO0FBRWQ7OztHQUdHO0FBQ0gscUJBQWEsNkJBQTZCO2FBTXRCLE1BQU0sRUFBRSxVQUFVO0lBTHBDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFxRTtJQUU5RixTQUFnQixJQUFJLFVBQW9CO0lBRXhDLFlBQ2tCLE1BQU0sRUFBRSxVQUFVLEVBQ2xDLE9BQU8sRUFBRSxHQUFHLEdBQUcsVUFBVSxFQU8xQjtJQUVELElBQVcsT0FBTyxlQUVqQjtJQUVNLGFBQWEsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBRXRDO0lBRU0sWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFckM7SUFFTSxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBRXpDO0lBRU0sb0JBQW9CLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUU3QztJQUVNLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFNUM7SUFFTSx5QkFBeUIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENB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
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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"}