From ac50255e54bf4eda62a35f09d65650784bd25f34 Mon Sep 17 00:00:00 2001 From: JK Date: Thu, 7 Nov 2024 16:44:31 +0100 Subject: [PATCH 1/2] Generalize governance to stake changes subscriber --- contracts/interfaces/ISFC.sol | 4 +-- contracts/sfc/SFC.sol | 48 +++++++++++++---------------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/contracts/interfaces/ISFC.sol b/contracts/interfaces/ISFC.sol index f507325..b24482d 100644 --- a/contracts/interfaces/ISFC.sol +++ b/contracts/interfaces/ISFC.sol @@ -175,9 +175,9 @@ interface ISFC { function setGenesisDelegation(address delegator, uint256 toValidatorID, uint256 stake) external; - function updateVoteBookAddress(address v) external; + function updateStakeSubscriberAddress(address v) external; - function voteBookAddress() external view returns (address); + function stakeSubscriberAddress() external view returns (address); function setRedirectionAuthorizer(address v) external; diff --git a/contracts/sfc/SFC.sol b/contracts/sfc/SFC.sol index dc793f9..a9b446b 100644 --- a/contracts/sfc/SFC.sol +++ b/contracts/sfc/SFC.sol @@ -102,8 +102,8 @@ contract SFC is Initializable, Ownable, Version { ConstantsManager internal c; - // the governance contract (to recalculate votes when the stake changes) - address public voteBookAddress; + // the contract subscribed to stake changes notifications + address public stakeSubscriberAddress; // address derived from the validator pubkey => validator id mapping(address pubkeyAddress => uint256 validatorID) public pubkeyAddressToValidatorID; @@ -161,8 +161,8 @@ contract SFC is Initializable, Ownable, Version { error TransfersNotAllowed(); error TransferFailed(); - // governance - error GovVotesRecountFailed(); + // stake changes subscriber + error StateSubscriberFailed(); // staking error InsufficientSelfStake(); @@ -369,18 +369,6 @@ contract SFC is Initializable, Ownable, Version { emit UpdatedSlashingRefundRatio(validatorID, refundRatio); } - /// Recount votes for a delegator and a validator. - /// Forces applying validators weights changes in governance voting. - function recountVotes(address delegator, address validatorAuth, bool strict, uint256 gas) external { - // solhint-disable-next-line avoid-low-level-calls - (bool success, ) = voteBookAddress.call{gas: gas}( - abi.encodeWithSignature("recountVotes(address,address)", delegator, validatorAuth) - ); - if (!success && strict) { - revert GovVotesRecountFailed(); - } - } - /// Delegate stake to a validator. function delegate(uint256 toValidatorID) external payable { _delegate(msg.sender, toValidatorID, msg.value); @@ -402,7 +390,7 @@ contract SFC is Initializable, Ownable, Version { _setValidatorDeactivated(validatorID, status); _syncValidator(validatorID, false); address validatorAddr = getValidator[validatorID].auth; - _recountVotes(validatorAddr, validatorAddr, false); + _notifyStakeSubscriber(validatorAddr, validatorAddr, false); } /// Stash rewards for a delegator. @@ -428,8 +416,8 @@ contract SFC is Initializable, Ownable, Version { } /// Update voteBook address. - function updateVoteBookAddress(address v) external onlyOwner { - voteBookAddress = v; + function updateStakeSubscriberAddress(address v) external onlyOwner { + stakeSubscriberAddress = v; } /// Get consts address. @@ -598,7 +586,7 @@ contract SFC is Initializable, Ownable, Version { emit Delegated(delegator, toValidatorID, amount); - _recountVotes(delegator, getValidator[toValidatorID].auth, strict); + _notifyStakeSubscriber(delegator, getValidator[toValidatorID].auth, strict); } /// Un-delegate stake from a validator. @@ -633,7 +621,7 @@ contract SFC is Initializable, Ownable, Version { _setValidatorDeactivated(toValidatorID, WITHDRAWN_BIT); } - _recountVotes(delegator, getValidator[toValidatorID].auth, strict); + _notifyStakeSubscriber(delegator, getValidator[toValidatorID].auth, strict); } /// Get slashing penalty for a stake. @@ -975,18 +963,18 @@ contract SFC is Initializable, Ownable, Version { totalSupply = totalSupply + amount; } - /// Recount votes for a delegator and a validator. - /// Force applying validators weights changes in governance voting. - function _recountVotes(address delegator, address validatorAuth, bool strict) internal { - if (voteBookAddress != address(0)) { - // Don't allow recountVotes to use up all the gas + /// Notify stake subscriber about staking changes. + /// Used to recount votes for a delegator and a validator in governance contract. + function _notifyStakeSubscriber(address delegator, address validatorAuth, bool strict) internal { + if (stakeSubscriberAddress != address(0)) { + // Don't allow announceStakeChange to use up all the gas // solhint-disable-next-line avoid-low-level-calls - (bool success, ) = voteBookAddress.call{gas: 8000000}( - abi.encodeWithSignature("recountVotes(address,address)", delegator, validatorAuth) + (bool success, ) = stakeSubscriberAddress.call{gas: 8000000}( + abi.encodeWithSignature("announceStakeChange(address,address)", delegator, validatorAuth) ); - // Don't revert if recountVotes failed unless strict mode enabled + // Don't revert if announceStakeChange failed unless strict mode enabled if (!success && strict) { - revert GovVotesRecountFailed(); + revert StateSubscriberFailed(); } } } From 235ebd9074818ac9023870a188c8a7ca8d91ebd3 Mon Sep 17 00:00:00 2001 From: JK Date: Sat, 9 Nov 2024 08:20:50 +0100 Subject: [PATCH 2/2] Fix spell --- contracts/sfc/SFC.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/sfc/SFC.sol b/contracts/sfc/SFC.sol index a9b446b..d3daf76 100644 --- a/contracts/sfc/SFC.sol +++ b/contracts/sfc/SFC.sol @@ -162,7 +162,7 @@ contract SFC is Initializable, Ownable, Version { error TransferFailed(); // stake changes subscriber - error StateSubscriberFailed(); + error StakeSubscriberFailed(); // staking error InsufficientSelfStake(); @@ -964,7 +964,7 @@ contract SFC is Initializable, Ownable, Version { } /// Notify stake subscriber about staking changes. - /// Used to recount votes for a delegator and a validator in governance contract. + /// Used to recount votes from delegators in the governance contract. function _notifyStakeSubscriber(address delegator, address validatorAuth, bool strict) internal { if (stakeSubscriberAddress != address(0)) { // Don't allow announceStakeChange to use up all the gas @@ -974,7 +974,7 @@ contract SFC is Initializable, Ownable, Version { ); // Don't revert if announceStakeChange failed unless strict mode enabled if (!success && strict) { - revert StateSubscriberFailed(); + revert StakeSubscriberFailed(); } } }