|
| 1 | +// SPDX-License-Identifier: BUSL-1.1 |
| 2 | +pragma solidity ^0.8.12; |
| 3 | + |
| 4 | +import "../../releases/Env.sol"; |
| 5 | +import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; |
| 6 | + |
| 7 | +// Types |
| 8 | +import "src/contracts/interfaces/IOperatorTableCalculator.sol"; |
| 9 | +import "src/contracts/libraries/OperatorSetLib.sol"; |
| 10 | +import "src/contracts/libraries/BN254.sol"; |
| 11 | +import "src/contracts/interfaces/IBaseCertificateVerifier.sol"; |
| 12 | + |
| 13 | +// For TOML parsing |
| 14 | +import {stdToml} from "forge-std/StdToml.sol"; |
| 15 | + |
| 16 | +/** |
| 17 | + * Purpose: Update the generator on a TESTNET environment |
| 18 | + */ |
| 19 | +contract QueueTransferProxyAdmin is MultisigBuilder { |
| 20 | + using Env for *; |
| 21 | + using OperatorSetLib for OperatorSet; |
| 22 | + using stdToml for string; |
| 23 | + |
| 24 | + string private constant TESTNET_CONFIG_PATH = "script/releases/v1.7.0-multichain/configs/testnet.toml"; |
| 25 | + |
| 26 | + function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) { |
| 27 | + GeneratorParams memory generatorParams = _getGeneratorParams(TESTNET_CONFIG_PATH); |
| 28 | + Env.proxy.operatorTableUpdater().updateGenerator(generatorParams.generator, generatorParams.generatorInfo); |
| 29 | + } |
| 30 | + |
| 31 | + function testScript() public virtual { |
| 32 | + // Require that the environment is a testnet environment supported by multichain |
| 33 | + require( |
| 34 | + Env._strEq(Env.env(), "testnet-sepolia") || Env._strEq(Env.env(), "testnet-base-sepolia"), |
| 35 | + "Environment must be a testnet environment" |
| 36 | + ); |
| 37 | + |
| 38 | + // Update the generator |
| 39 | + execute(); |
| 40 | + |
| 41 | + // Get the generator params |
| 42 | + GeneratorParams memory generatorParams = _getGeneratorParams(TESTNET_CONFIG_PATH); |
| 43 | + |
| 44 | + // Check that the generator has been updated in the operator table updater |
| 45 | + OperatorTableUpdater operatorTableUpdater = Env.proxy.operatorTableUpdater(); |
| 46 | + assertEq( |
| 47 | + operatorTableUpdater.getGenerator().key(), |
| 48 | + generatorParams.generator.key(), |
| 49 | + "operatorTableUpdater.generator invalid" |
| 50 | + ); |
| 51 | + assertEq( |
| 52 | + operatorTableUpdater.getGeneratorReferenceTimestamp(), |
| 53 | + operatorTableUpdater.GENERATOR_REFERENCE_TIMESTAMP(), |
| 54 | + "operatorTableUpdater.generatorReferenceTimestamp invalid" |
| 55 | + ); |
| 56 | + assertEq( |
| 57 | + operatorTableUpdater.getGeneratorReferenceTimestamp(), |
| 58 | + 1, |
| 59 | + "operatorTableUpdater.generatorReferenceTimestamp invalid" |
| 60 | + ); |
| 61 | + assertEq( |
| 62 | + operatorTableUpdater.getGlobalTableRootByTimestamp(1), |
| 63 | + operatorTableUpdater.GENERATOR_GLOBAL_TABLE_ROOT(), |
| 64 | + "operatorTableUpdater.generatorGlobalTableRoot invalid" |
| 65 | + ); |
| 66 | + |
| 67 | + // Check that the generator has been updated in the certificate verifier |
| 68 | + BN254CertificateVerifier certificateVerifier = Env.proxy.bn254CertificateVerifier(); |
| 69 | + assertEq( |
| 70 | + certificateVerifier.latestReferenceTimestamp(generatorParams.generator), |
| 71 | + operatorTableUpdater.GENERATOR_REFERENCE_TIMESTAMP(), |
| 72 | + "certificateVerifier.latestReferenceTimestamp invalid" |
| 73 | + ); |
| 74 | + assertEq( |
| 75 | + IBaseCertificateVerifier(address(certificateVerifier)).maxOperatorTableStaleness(generatorParams.generator), |
| 76 | + operatorTableUpdater.GENERATOR_MAX_STALENESS_PERIOD(), |
| 77 | + "certificateVerifier.maxStalenessPeriod invalid" |
| 78 | + ); |
| 79 | + assertEq( |
| 80 | + certificateVerifier.getOperatorSetOwner(generatorParams.generator), |
| 81 | + address(operatorTableUpdater), |
| 82 | + "certificateVerifier.operatorSetOwner invalid" |
| 83 | + ); |
| 84 | + // Get the operatorSetInfo |
| 85 | + IOperatorTableCalculatorTypes.BN254OperatorSetInfo memory operatorSetInfo = certificateVerifier |
| 86 | + .getOperatorSetInfo(generatorParams.generator, operatorTableUpdater.GENERATOR_REFERENCE_TIMESTAMP()); |
| 87 | + assertEq( |
| 88 | + operatorSetInfo.numOperators, |
| 89 | + generatorParams.generatorInfo.numOperators, |
| 90 | + "certificateVerifier.getOperatorSetInfo.numOperators invalid" |
| 91 | + ); |
| 92 | + assertEq( |
| 93 | + operatorSetInfo.operatorInfoTreeRoot, |
| 94 | + generatorParams.generatorInfo.operatorInfoTreeRoot, |
| 95 | + "certificateVerifier.getOperatorSetInfo.operatorInfoTreeRoot invalid" |
| 96 | + "certificateVerifier.getOperatorSetInfo invalid" |
| 97 | + ); |
| 98 | + assertEq( |
| 99 | + operatorSetInfo.aggregatePubkey.X, |
| 100 | + generatorParams.generatorInfo.aggregatePubkey.X, |
| 101 | + "certificateVerifier.getOperatorSetInfo.aggregatePubkey.X invalid" |
| 102 | + ); |
| 103 | + assertEq( |
| 104 | + operatorSetInfo.aggregatePubkey.Y, |
| 105 | + generatorParams.generatorInfo.aggregatePubkey.Y, |
| 106 | + "certificateVerifier.getOperatorSetInfo.aggregatePubkey.Y invalid" |
| 107 | + ); |
| 108 | + assertEq( |
| 109 | + operatorSetInfo.totalWeights, |
| 110 | + generatorParams.generatorInfo.totalWeights, |
| 111 | + "certificateVerifier.getOperatorSetInfo.totalWeights invalid" |
| 112 | + ); |
| 113 | + } |
| 114 | + |
| 115 | + function _getGeneratorParams( |
| 116 | + string memory path |
| 117 | + ) internal view returns (GeneratorParams memory generatorParams) { |
| 118 | + // Read the TOML file |
| 119 | + string memory root = vm.projectRoot(); |
| 120 | + string memory fullPath = string.concat(root, "/", path); |
| 121 | + string memory toml = vm.readFile(fullPath); |
| 122 | + |
| 123 | + // Parse globalRootConfirmerSet |
| 124 | + address avs = toml.readAddress(".globalRootConfirmerSet.avs"); |
| 125 | + uint32 id = uint32(toml.readUint(".globalRootConfirmerSet.id")); |
| 126 | + generatorParams.generator = OperatorSet({avs: avs, id: id}); |
| 127 | + |
| 128 | + // Parse globalRootConfirmerSetInfo |
| 129 | + generatorParams.generatorInfo.numOperators = uint256(toml.readUint(".globalRootConfirmerSetInfo.numOperators")); |
| 130 | + generatorParams.generatorInfo.operatorInfoTreeRoot = |
| 131 | + toml.readBytes32(".globalRootConfirmerSetInfo.operatorInfoTreeRoot"); |
| 132 | + generatorParams.generatorInfo.totalWeights = toml.readUintArray(".globalRootConfirmerSetInfo.totalWeights"); |
| 133 | + uint256 apkX = toml.readUint(".globalRootConfirmerSetInfo.aggregatePubkey.X"); |
| 134 | + uint256 apkY = toml.readUint(".globalRootConfirmerSetInfo.aggregatePubkey.Y"); |
| 135 | + generatorParams.generatorInfo.aggregatePubkey = BN254.G1Point({X: apkX, Y: apkY}); |
| 136 | + |
| 137 | + return generatorParams; |
| 138 | + } |
| 139 | + |
| 140 | + struct GeneratorParams { |
| 141 | + OperatorSet generator; |
| 142 | + IOperatorTableCalculatorTypes.BN254OperatorSetInfo generatorInfo; |
| 143 | + } |
| 144 | +} |
0 commit comments