From 062a1c6e404a62a73e06167f46c64cd7c7d0a7dc Mon Sep 17 00:00:00 2001 From: nxqbao Date: Wed, 14 Sep 2022 10:53:59 +0700 Subject: [PATCH] [Slash] Add governanceAdmin in initializing contract --- contracts/interfaces/ISlashIndicator.sol | 13 ++++++++++ contracts/mocks/MockSlashIndicator.sol | 2 ++ contracts/slashing/SlashIndicator.sol | 26 +++++++++++++++++-- src/deploy/proxy/slash-indicator-proxy.ts | 3 ++- .../integration/ActionSlashValidators.test.ts | 3 ++- test/integration/ActionSubmitReward.test.ts | 3 ++- test/integration/ActionWrapUpEpoch.test.ts | 3 ++- test/slash/SlashIndicator.test.ts | 8 +++--- 8 files changed, 52 insertions(+), 9 deletions(-) diff --git a/contracts/interfaces/ISlashIndicator.sol b/contracts/interfaces/ISlashIndicator.sol index 597f46220..c9b631d2b 100644 --- a/contracts/interfaces/ISlashIndicator.sol +++ b/contracts/interfaces/ISlashIndicator.sol @@ -17,6 +17,8 @@ interface ISlashIndicator { event SlashDoubleSignAmountUpdated(uint256 slashDoubleSignAmount); /// @dev Emiited when the duration of jailing felony updated event FelonyJailDurationUpdated(uint256 felonyJailDuration); + /// @dev Emitted when the address of governance admin is updated. + event GovernanceAdminUpdated(address); enum SlashType { UNKNOWN, @@ -106,6 +108,17 @@ interface ISlashIndicator { */ function setFelonyJailDuration(uint256 _felonyJailDuration) external; + /** + * @dev Updates the governance admin + * + * Requirements: + * - The method caller is the governance admin + * + * Emits the event `GovernanceAdminUpdated` + * + */ + function setGovernanceAdmin(address _governanceAdmin) external; + /** * @dev Gets slash indicator of a validator */ diff --git a/contracts/mocks/MockSlashIndicator.sol b/contracts/mocks/MockSlashIndicator.sol index 0d36a3ad1..bb764c950 100644 --- a/contracts/mocks/MockSlashIndicator.sol +++ b/contracts/mocks/MockSlashIndicator.sol @@ -52,6 +52,8 @@ contract MockSlashIndicator is ISlashIndicator { function governanceAdmin() external view override returns (address) {} + function setGovernanceAdmin(address __newAddr) external override {} + function setSlashFelonyAmount(uint256 _slashFelonyAmount) external override {} function setSlashDoubleSignAmount(uint256 _slashDoubleSignAmount) external override {} diff --git a/contracts/slashing/SlashIndicator.sol b/contracts/slashing/SlashIndicator.sol index 483c528eb..d50000d5d 100644 --- a/contracts/slashing/SlashIndicator.sol +++ b/contracts/slashing/SlashIndicator.sol @@ -61,15 +61,16 @@ contract SlashIndicator is ISlashIndicator, Initializable { * @dev Initializes the contract storage. */ function initialize( + address __governanceAdmin, + IRoninValidatorSet _validatorSetContract, uint256 _misdemeanorThreshold, uint256 _felonyThreshold, - IRoninValidatorSet _validatorSetContract, uint256 _slashFelonyAmount, uint256 _slashDoubleSignAmount, uint256 _felonyJailBlocks ) external initializer { validatorContract = _validatorSetContract; - + _setGovernanceAdmin(__governanceAdmin); _setSlashThresholds(_felonyThreshold, _misdemeanorThreshold); _setSlashFelonyAmount(_slashFelonyAmount); _setSlashDoubleSignAmount(_slashDoubleSignAmount); @@ -138,6 +139,13 @@ contract SlashIndicator is ISlashIndicator, Initializable { // GOVERNANCE FUNCTIONS // /////////////////////////////////////////////////////////////////////////////////////// + /** + * @inheritdoc ISlashIndicator + */ + function setGovernanceAdmin(address __governanceAdmin) external override onlyGovernanceAdmin { + _setGovernanceAdmin(__governanceAdmin); + } + /** * @inheritdoc ISlashIndicator */ @@ -199,6 +207,20 @@ contract SlashIndicator is ISlashIndicator, Initializable { // HELPER FUNCTIONS // /////////////////////////////////////////////////////////////////////////////////////// + /** + * @dev Updates the address of governance admin + */ + function _setGovernanceAdmin(address __governanceAdmin) internal { + if (__governanceAdmin == _governanceAdmin) { + return; + } + + require(__governanceAdmin != address(0), "SlashIndicator: Cannot set admin to zero address"); + + _governanceAdmin == __governanceAdmin; + emit GovernanceAdminUpdated(__governanceAdmin); + } + /** * @dev Sets the slash thresholds */ diff --git a/src/deploy/proxy/slash-indicator-proxy.ts b/src/deploy/proxy/slash-indicator-proxy.ts index 218592aef..e65819853 100644 --- a/src/deploy/proxy/slash-indicator-proxy.ts +++ b/src/deploy/proxy/slash-indicator-proxy.ts @@ -11,9 +11,10 @@ const deploy = async ({ getNamedAccounts, deployments }: HardhatRuntimeEnvironme const logicContract = await deployments.get('SlashIndicatorLogic'); const data = new SlashIndicator__factory().interface.encodeFunctionData('initialize', [ + initAddress[network.name]!.governanceAdmin, + initAddress[network.name]!.validatorContract, slashIndicatorConf[network.name]!.misdemeanorThreshold, slashIndicatorConf[network.name]!.felonyThreshold, - initAddress[network.name]!.validatorContract, slashIndicatorConf[network.name]!.slashFelonyAmount, slashIndicatorConf[network.name]!.slashDoubleSignAmount, slashIndicatorConf[network.name]!.felonyJailBlocks, diff --git a/test/integration/ActionSlashValidators.test.ts b/test/integration/ActionSlashValidators.test.ts index 938b0e3ed..3ab052b77 100644 --- a/test/integration/ActionSlashValidators.test.ts +++ b/test/integration/ActionSlashValidators.test.ts @@ -76,9 +76,10 @@ describe('[Integration] Slash validators', () => { slashLogicContract.address, proxyAdmin.address, slashLogicContract.interface.encodeFunctionData('initialize', [ + governanceAdmin.address, + roninValidatorSetAddr, slashIndicatorConf[network.name]!.misdemeanorThreshold, slashIndicatorConf[network.name]!.felonyThreshold, - roninValidatorSetAddr, slashIndicatorConf[network.name]!.slashFelonyAmount, slashIndicatorConf[network.name]!.slashDoubleSignAmount, slashIndicatorConf[network.name]!.felonyJailBlocks, diff --git a/test/integration/ActionSubmitReward.test.ts b/test/integration/ActionSubmitReward.test.ts index f0ea27f2e..f031a5cdd 100644 --- a/test/integration/ActionSubmitReward.test.ts +++ b/test/integration/ActionSubmitReward.test.ts @@ -75,9 +75,10 @@ describe('[Integration] Submit Block Reward', () => { slashLogicContract.address, proxyAdmin.address, slashLogicContract.interface.encodeFunctionData('initialize', [ + governanceAdmin.address, + roninValidatorSetAddr, slashIndicatorConf[network.name]!.misdemeanorThreshold, slashIndicatorConf[network.name]!.felonyThreshold, - roninValidatorSetAddr, slashIndicatorConf[network.name]!.slashFelonyAmount, slashIndicatorConf[network.name]!.slashDoubleSignAmount, slashIndicatorConf[network.name]!.felonyJailBlocks, diff --git a/test/integration/ActionWrapUpEpoch.test.ts b/test/integration/ActionWrapUpEpoch.test.ts index 68921c4f5..6b6d550fa 100644 --- a/test/integration/ActionWrapUpEpoch.test.ts +++ b/test/integration/ActionWrapUpEpoch.test.ts @@ -76,9 +76,10 @@ describe('[Integration] Wrap up epoch', () => { slashLogicContract.address, proxyAdmin.address, slashLogicContract.interface.encodeFunctionData('initialize', [ + governanceAdmin.address, + roninValidatorSetAddr, slashIndicatorConf[network.name]!.misdemeanorThreshold, slashIndicatorConf[network.name]!.felonyThreshold, - roninValidatorSetAddr, slashIndicatorConf[network.name]!.slashFelonyAmount, slashIndicatorConf[network.name]!.slashDoubleSignAmount, slashIndicatorConf[network.name]!.felonyJailBlocks, diff --git a/test/slash/SlashIndicator.test.ts b/test/slash/SlashIndicator.test.ts index 55b0531ce..793116ae5 100644 --- a/test/slash/SlashIndicator.test.ts +++ b/test/slash/SlashIndicator.test.ts @@ -12,7 +12,7 @@ import { import { Address } from 'hardhat-deploy/dist/types'; import { SlashType } from './slashType'; import { Network, slashIndicatorConf } from '../../src/config'; -import { BigNumber } from 'ethers'; +import { BigNumber, Signer } from 'ethers'; import { expects as SlashExpects } from '../helpers/slash-indicator'; let slashContract: SlashIndicator; @@ -21,6 +21,7 @@ let deployer: SignerWithAddress; let proxyAdmin: SignerWithAddress; let mockValidatorsContract: MockValidatorSetForSlash; let vagabond: SignerWithAddress; +let governanceAdmin: SignerWithAddress; let coinbases: SignerWithAddress[]; let defaultCoinbase: Address; let localIndicators: number[]; @@ -55,7 +56,7 @@ describe('Slash indicator test', () => { let misdemeanorThreshold: number; before(async () => { - [deployer, proxyAdmin, vagabond, ...coinbases] = await ethers.getSigners(); + [deployer, proxyAdmin, vagabond, governanceAdmin, ...coinbases] = await ethers.getSigners(); localIndicators = Array(coinbases.length).fill(0); defaultCoinbase = await network.provider.send('eth_coinbase'); @@ -75,9 +76,10 @@ describe('Slash indicator test', () => { logicContract.address, proxyAdmin.address, logicContract.interface.encodeFunctionData('initialize', [ + governanceAdmin.address, + mockValidatorsContract.address, slashIndicatorConf[network.name]!.misdemeanorThreshold, slashIndicatorConf[network.name]!.felonyThreshold, - mockValidatorsContract.address, slashIndicatorConf[network.name]!.slashFelonyAmount, slashIndicatorConf[network.name]!.slashDoubleSignAmount, slashIndicatorConf[network.name]!.felonyJailBlocks,