Skip to content

Commit

Permalink
gateway: include genesis validators in gateway parent validators tracker
Browse files Browse the repository at this point in the history
Signed-off-by: Sander Pick <sanderpick@gmail.com>
  • Loading branch information
sanderpick committed Oct 8, 2024
1 parent d0892f2 commit 6586f72
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 10 deletions.
15 changes: 14 additions & 1 deletion contracts/contracts/GatewayDiamond.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions contracts/contracts/lib/LibStaking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
***********************************************************************/
Expand Down
9 changes: 8 additions & 1 deletion contracts/test/IntegrationTestBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
});
Expand Down
21 changes: 13 additions & 8 deletions contracts/test/integration/GatewayDiamond.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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");
Expand All @@ -1013,21 +1018,21 @@ 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();
require(configNumber == 0, "wrong config number after applying finality");
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();
}
Expand Down

0 comments on commit 6586f72

Please sign in to comment.