Skip to content

Commit

Permalink
feat(contracts): auto activate validator when deposit
Browse files Browse the repository at this point in the history
  • Loading branch information
seolaoh committed Jul 31, 2024
1 parent 5583cf9 commit 3d51fd6
Show file tree
Hide file tree
Showing 10 changed files with 225 additions and 125 deletions.
2 changes: 1 addition & 1 deletion kroma-bindings/bindings/assetmanager.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion kroma-bindings/bindings/assetmanager_more.go

Large diffs are not rendered by default.

25 changes: 23 additions & 2 deletions kroma-bindings/bindings/validatormanager.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion kroma-bindings/bindings/validatormanager_more.go

Large diffs are not rendered by default.

200 changes: 102 additions & 98 deletions packages/contracts/.gas-snapshot

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions packages/contracts/contracts/L1/AssetManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,8 @@ contract AssetManager is ISemver, IERC721Receiver, IAssetManager {

_deposit(msg.sender, assets, true);
emit Deposited(msg.sender, assets);

VALIDATOR_MANAGER.tryActivateValidator(msg.sender);
}

/**
Expand Down
21 changes: 19 additions & 2 deletions packages/contracts/contracts/L1/ValidatorManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,14 @@ contract ValidatorManager is ISemver, IValidatorManager {
_;
}

/**
* @notice A modifier that only allows AssetManager contract to call.
*/
modifier onlyAssetManager() {
if (msg.sender != address(ASSET_MANAGER)) revert NotAllowedCaller();
_;
}

/**
* @notice Semantic version.
* @custom:semver 1.0.0
Expand Down Expand Up @@ -213,6 +221,14 @@ contract ValidatorManager is ISemver, IValidatorManager {
_activateValidator(msg.sender);
}

/**
* @inheritdoc IValidatorManager
*/
function tryActivateValidator(address validator) external onlyAssetManager {
if (getStatus(validator) == ValidatorStatus.READY && !inJail(validator))
_activateValidator(validator);
}

/**
* @inheritdoc IValidatorManager
*/
Expand Down Expand Up @@ -262,8 +278,9 @@ contract ValidatorManager is ISemver, IValidatorManager {
if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender))
revert ImproperValidatorStatus();

if (block.timestamp < canFinalizeCommissionChangeAt(msg.sender))
revert NotElapsedCommissionChangeDelay();
uint128 canFinalizeAt = canFinalizeCommissionChangeAt(msg.sender);
if (canFinalizeAt == COMMISSION_CHANGE_DELAY_SECONDS) revert NotInitiatedCommissionChange();
if (block.timestamp < canFinalizeAt) revert NotElapsedCommissionChangeDelay();

Validator storage validatorInfo = _validatorInfo[msg.sender];
uint8 oldCommissionRate = validatorInfo.commissionRate;
Expand Down
14 changes: 14 additions & 0 deletions packages/contracts/contracts/L1/interfaces/IValidatorManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,11 @@ interface IValidatorManager {
*/
error SameCommissionRate();

/**
* @notice Reverts when the commission rate change has not been initiated.
*/
error NotInitiatedCommissionChange();

/**
* @notice Reverts when the delay of commission rate change finalization has not elapsed.
*/
Expand Down Expand Up @@ -276,6 +281,15 @@ interface IValidatorManager {
*/
function activateValidator() external;

/**
* @notice Tries to activate a validator and adds the validator to validator tree. To submit
* outputs, the validator should be activated. This function can only be called by
* AssetManager.
*
* @param validator Address of the validator.
*/
function tryActivateValidator(address validator) external;

/**
* @notice Handles some essential actions such as reward distribution, jail handling, next
* priority validator selection after output submission. This function can only be
Expand Down
36 changes: 36 additions & 0 deletions packages/contracts/contracts/test/AssetManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,42 @@ contract AssetManagerTest is ValidatorSystemUpgrade_Initializer {
assertEq(assetToken.balanceOf(validator), beforeBalance - bondAmount);
}

function test_deposit_activate_succeeds() external {
_registerValidator(minActivateAmount - 1);
assertEq(valMgr.getWeight(validator), 0);

vm.startPrank(validator);
assetToken.approve(address(assetMgr), 1);
assetMgr.deposit(1);

assertEq(valMgr.getWeight(validator), minActivateAmount);
}

function test_deposit_notActivate_succeeds() external {
_registerValidator(minActivateAmount - 2);
assertEq(valMgr.getWeight(validator), 0);

vm.startPrank(validator);
assetToken.approve(address(assetMgr), 1);
assetMgr.deposit(1);

assertEq(valMgr.getWeight(validator), 0);
}

function test_deposit_inJailNotActivate_succeeds() external {
_registerValidator(minActivateAmount - 1);
assertEq(valMgr.getWeight(validator), 0);

mockValMgr.sendToJail(validator);
assertTrue(valMgr.inJail(validator));

vm.startPrank(validator);
assetToken.approve(address(assetMgr), 1);
assetMgr.deposit(1);

assertEq(valMgr.getWeight(validator), 0);
}

function test_deposit_zeroAsset_reverts() external {
vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector);
assetMgr.deposit(0);
Expand Down
46 changes: 26 additions & 20 deletions packages/contracts/contracts/test/ValidatorManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -273,26 +273,6 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer {
valMgr.registerValidator(assets, 10, address(0));
}

function test_activateValidator_succeeds() external {
uint32 count = valMgr.activatedValidatorCount();

_registerValidator(trusted, minActivateAmount - 1);
assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED);
vm.startPrank(trusted);
assetToken.approve(address(assetMgr), 1);
assetMgr.deposit(1);
assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.READY);

vm.expectEmit(true, false, false, true, address(valMgr));
emit ValidatorActivated(trusted, block.timestamp);
valMgr.activateValidator();
vm.stopPrank();

assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.ACTIVE);
assertEq(valMgr.activatedValidatorCount(), count + 1);
assertEq(valMgr.getWeight(trusted), minActivateAmount);
}

function test_activateValidator_notValidator_reverts() external {
assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.NONE);

Expand Down Expand Up @@ -350,6 +330,24 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer {
valMgr.activateValidator();
}

function test_tryActivateValidator_succeeds() external {
uint32 count = valMgr.activatedValidatorCount();

_registerValidator(trusted, minActivateAmount - 1);
assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED);

vm.startPrank(trusted);
assetToken.approve(address(assetMgr), 1);
vm.expectEmit(true, false, false, true, address(valMgr));
emit ValidatorActivated(trusted, block.timestamp);
assetMgr.deposit(1);
vm.stopPrank();

assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.ACTIVE);
assertEq(valMgr.activatedValidatorCount(), count + 1);
assertEq(valMgr.getWeight(trusted), minActivateAmount);
}

function test_afterSubmitL2Output_distributeReward_succeeds() external {
// Register validator with commission rate 10%
_registerValidator(trusted, minActivateAmount);
Expand Down Expand Up @@ -624,6 +622,14 @@ contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer {
valMgr.finalizeCommissionChange();
}

function test_finalizeCommissionChange_notInitiated_reverts() external {
_registerValidator(trusted, minActivateAmount);

vm.prank(trusted);
vm.expectRevert(IValidatorManager.NotInitiatedCommissionChange.selector);
valMgr.finalizeCommissionChange();
}

function test_tryUnjail_succeeds() external {
test_afterSubmitL2Output_tryJail_succeeds();
assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.READY);
Expand Down

0 comments on commit 3d51fd6

Please sign in to comment.