From 6586f721d563482b8b16f674c6f9dddf39852368 Mon Sep 17 00:00:00 2001 From: Sander Pick Date: Tue, 8 Oct 2024 09:38:06 -0700 Subject: [PATCH] gateway: include genesis validators in gateway parent validators tracker Signed-off-by: Sander Pick --- contracts/contracts/GatewayDiamond.sol | 15 ++++++++++++- contracts/contracts/lib/LibStaking.sol | 5 +++++ contracts/test/IntegrationTestBase.sol | 9 +++++++- .../test/integration/GatewayDiamond.t.sol | 21 ++++++++++++------- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/contracts/contracts/GatewayDiamond.sol b/contracts/contracts/GatewayDiamond.sol index 9a87be704..20e9cde59 100644 --- a/contracts/contracts/GatewayDiamond.sol +++ b/contracts/contracts/GatewayDiamond.sol @@ -11,7 +11,7 @@ import {InvalidCollateral, InvalidSubmissionPeriod, InvalidMajorityPercentage} f import {LibDiamond} from "./lib/LibDiamond.sol"; import {LibGateway} from "./lib/LibGateway.sol"; import {SubnetID} from "./structs/Subnet.sol"; -import {LibStaking} from "./lib/LibStaking.sol"; +import {LibStaking, LibValidatorSet} from "./lib/LibStaking.sol"; import {BATCH_PERIOD, MAX_MSGS_PER_BATCH} from "./structs/CrossNet.sol"; error FunctionNotFound(bytes4 _functionSelector); @@ -73,6 +73,19 @@ contract GatewayDiamond { // The startConfiguration number is also 1 to match with nextConfigurationNumber, indicating we have // empty validator change logs s.validatorsTracker.changes.startConfigurationNumber = LibStaking.INITIAL_CONFIGURATION_NUMBER; + // Add genesis validators to the parent validators tracker. + uint256 vLength = params.genesisValidators.length; + for (uint256 i; i < vLength; ) { + address addr = params.genesisValidators[i].addr; + uint256 amount = params.genesisValidators[i].weight; + bytes memory metadata = params.genesisValidators[i].metadata; + LibValidatorSet.setMetadataFromConstructor(s.validatorsTracker.validators, addr, metadata); + LibValidatorSet.recordDeposit(s.validatorsTracker.validators, addr, amount); + LibValidatorSet.confirmDeposit(s.validatorsTracker.validators, addr, amount); + unchecked { + ++i; + } + } // set initial validators and update membership Membership memory initial = Membership({configurationNumber: 0, validators: params.genesisValidators}); LibGateway.updateMembership(initial); diff --git a/contracts/contracts/lib/LibStaking.sol b/contracts/contracts/lib/LibStaking.sol index cfb1f7a79..a0a1e82eb 100644 --- a/contracts/contracts/lib/LibStaking.sol +++ b/contracts/contracts/lib/LibStaking.sol @@ -203,6 +203,11 @@ library LibValidatorSet { validators.validators[validator].metadata = metadata; } + /// @notice Set validator data using metadata from memory bytes + function setMetadataFromConstructor(ValidatorSet storage validators, address validator, bytes memory metadata) internal { + validators.validators[validator].metadata = metadata; + } + /*********************************************************************** * Internal helper functions, should not be called by external functions ***********************************************************************/ diff --git a/contracts/test/IntegrationTestBase.sol b/contracts/test/IntegrationTestBase.sol index 84eaf5456..3432c7455 100644 --- a/contracts/test/IntegrationTestBase.sol +++ b/contracts/test/IntegrationTestBase.sol @@ -305,11 +305,18 @@ contract IntegrationTestBase is Test, TestParams, TestRegistry, TestSubnetActor, } function defaultGatewayParams() internal view virtual returns (GatewayDiamond.ConstructorParams memory) { + uint256 genesisValidator = 99; + Validator[] memory validators = new Validator[](1); + validators[0] = Validator({ + weight: 10000, + addr: vm.addr(genesisValidator), + metadata: TestUtils.derivePubKeyBytes(genesisValidator) + }); GatewayDiamond.ConstructorParams memory params = GatewayDiamond.ConstructorParams({ networkName: SubnetID({root: ROOTNET_CHAINID, route: new address[](0)}), bottomUpCheckPeriod: DEFAULT_CHECKPOINT_PERIOD, majorityPercentage: DEFAULT_MAJORITY_PERCENTAGE, - genesisValidators: new Validator[](0), + genesisValidators: validators, activeValidatorsLimit: DEFAULT_ACTIVE_VALIDATORS_LIMIT, commitSha: DEFAULT_COMMIT_SHA }); diff --git a/contracts/test/integration/GatewayDiamond.t.sol b/contracts/test/integration/GatewayDiamond.t.sol index 0759b98f0..43dbb7ecd 100644 --- a/contracts/test/integration/GatewayDiamond.t.sol +++ b/contracts/test/integration/GatewayDiamond.t.sol @@ -965,6 +965,11 @@ contract GatewayActorDiamondTest is Test, IntegrationTestBase, SubnetWithNativeT } function testGatewayDiamond_applyFinality_works() public { + // check membership from genesis + require( + gatewayDiamond.getter().getCurrentMembership().validators.length == 1, + "current membership should be 1" + ); // changes included for two validators joining address val1 = vm.addr(100); address val2 = vm.addr(101); @@ -986,8 +991,8 @@ contract GatewayActorDiamondTest is Test, IntegrationTestBase, SubnetWithNativeT uint64 configNumber = gatewayDiamond.topDownFinalizer().applyFinalityChanges(); require(configNumber == 2, "wrong config number after applying finality"); require( - gatewayDiamond.getter().getCurrentMembership().validators.length == 2, - "current membership should be 2" + gatewayDiamond.getter().getCurrentMembership().validators.length == 3, + "current membership should be 3" ); require(gatewayDiamond.getter().getCurrentConfigurationNumber() == 2, "unexpected config number"); require(gatewayDiamond.getter().getLastConfigurationNumber() == 0, "unexpected last config number"); @@ -1013,10 +1018,10 @@ contract GatewayActorDiamondTest is Test, IntegrationTestBase, SubnetWithNativeT ); require(gatewayDiamond.getter().getCurrentConfigurationNumber() == 3, "apply result: unexpected config number"); require( - gatewayDiamond.getter().getCurrentMembership().validators.length == 1, - "current membership should be 1" + gatewayDiamond.getter().getCurrentMembership().validators.length == 2, + "current membership should be 2" ); - require(gatewayDiamond.getter().getLastMembership().validators.length == 2, "last membership should be 2"); + require(gatewayDiamond.getter().getLastMembership().validators.length == 3, "last membership should be 3"); // no changes configNumber = gatewayDiamond.topDownFinalizer().applyFinalityChanges(); @@ -1024,10 +1029,10 @@ contract GatewayActorDiamondTest is Test, IntegrationTestBase, SubnetWithNativeT require(gatewayDiamond.getter().getLastConfigurationNumber() == 2, "no changes: unexpected last config number"); require(gatewayDiamond.getter().getCurrentConfigurationNumber() == 3, "no changes: unexpected config number"); require( - gatewayDiamond.getter().getCurrentMembership().validators.length == 1, - "current membership should be 1" + gatewayDiamond.getter().getCurrentMembership().validators.length == 2, + "current membership should be 2" ); - require(gatewayDiamond.getter().getLastMembership().validators.length == 2, "last membership should be 2"); + require(gatewayDiamond.getter().getLastMembership().validators.length == 3, "last membership should be 3"); vm.stopPrank(); }