Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: include genesis validators in gateway parent validators tracker #1166

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this technically works for Staking backed power, but will not work for federated. Ideally it would call record federated based on the permission mode.

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 {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugly... we can only have bytes memory in the constructor.

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
Loading