69 lines
2.7 KiB
Solidity
69 lines
2.7 KiB
Solidity
pragma solidity 0.4.24;
|
|
|
|
import "./BaseBridgeValidators.sol";
|
|
|
|
contract RewardableValidators is BaseBridgeValidators {
|
|
function initialize(
|
|
uint256 _requiredSignatures,
|
|
address[] _initialValidators,
|
|
address[] _initialRewards,
|
|
address _owner
|
|
) external onlyRelevantSender returns (bool) {
|
|
require(!isInitialized());
|
|
_setOwner(_owner);
|
|
require(_requiredSignatures != 0);
|
|
require(_initialValidators.length >= _requiredSignatures);
|
|
require(_initialValidators.length == _initialRewards.length);
|
|
|
|
for (uint256 i = 0; i < _initialValidators.length; i++) {
|
|
require(_initialValidators[i] != address(0) && _initialValidators[i] != F_ADDR);
|
|
require(_initialRewards[i] != address(0));
|
|
require(!isValidator(_initialValidators[i]));
|
|
|
|
if (i == 0) {
|
|
setNextValidator(F_ADDR, _initialValidators[i]);
|
|
if (_initialValidators.length == 1) {
|
|
setNextValidator(_initialValidators[i], F_ADDR);
|
|
}
|
|
} else if (i == _initialValidators.length - 1) {
|
|
setNextValidator(_initialValidators[i - 1], _initialValidators[i]);
|
|
setNextValidator(_initialValidators[i], F_ADDR);
|
|
} else {
|
|
setNextValidator(_initialValidators[i - 1], _initialValidators[i]);
|
|
}
|
|
|
|
setValidatorRewardAddress(_initialValidators[i], _initialRewards[i]);
|
|
emit ValidatorAdded(_initialValidators[i]);
|
|
}
|
|
|
|
setValidatorCount(_initialValidators.length);
|
|
uintStorage[REQUIRED_SIGNATURES] = _requiredSignatures;
|
|
uintStorage[DEPLOYED_AT_BLOCK] = block.number;
|
|
setInitialize();
|
|
emit RequiredSignaturesChanged(_requiredSignatures);
|
|
|
|
return isInitialized();
|
|
}
|
|
|
|
function addRewardableValidator(address _validator, address _reward) external onlyOwner {
|
|
require(_reward != address(0));
|
|
_addValidator(_validator);
|
|
setValidatorRewardAddress(_validator, _reward);
|
|
emit ValidatorAdded(_validator);
|
|
}
|
|
|
|
function removeValidator(address _validator) external onlyOwner {
|
|
_removeValidator(_validator);
|
|
deleteItemFromAddressStorage("validatorsRewards", _validator);
|
|
emit ValidatorRemoved(_validator);
|
|
}
|
|
|
|
function getValidatorRewardAddress(address _validator) external view returns (address) {
|
|
return addressStorage[keccak256(abi.encodePacked("validatorsRewards", _validator))];
|
|
}
|
|
|
|
function setValidatorRewardAddress(address _validator, address _reward) internal {
|
|
addressStorage[keccak256(abi.encodePacked("validatorsRewards", _validator))] = _reward;
|
|
}
|
|
}
|