Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- contract PoANoEvents {
- event InitiateChange(bytes32 indexed _parent_hash, address[] _new_set);
- address public keysManager;
- address[] public validators;
- mapping(address => uint) public vIndex;
- mapping(address => bool) public validV;
- modifier onlyKeysManager() {
- require(msg.sender == keysManager);
- _;
- }
- function PoANoEvents(address master, address _keysManager){
- addValidator(master, true);
- keysManager = _keysManager;
- }
- function addValidator(address newValidator, bool shouldFireEvent) public onlyKeysManager {
- require(!validV[newValidator]);
- uint index = validators.length;
- validators.push(newValidator);
- vIndex[newValidator] = index;
- validV[newValidator] = true;
- if(shouldFireEvent) {
- fireEvent();
- }
- }
- function removeValidator(address oldValidator, bool shouldFireEvent) public onlyKeysManager {
- require(validV[oldValidator]);
- uint256 removedIndex = vIndex[oldValidator];
- // Can not remove the last validator.
- uint256 lastIndex = validators.length - 1;
- address lastValidator = validators[lastIndex];
- // Override the removed validator with the last one.
- validators[removedIndex] = lastValidator;
- // Update the index of the last validator.
- vIndex[lastValidator] = removedIndex;
- delete validators[lastIndex];
- validators.length--;
- validV[oldValidator] = false;
- if(shouldFireEvent){
- fireEvent();
- }
- }
- function fireEvent() public {
- InitiateChange(block.blockhash(block.number - 1), validators);
- }
- function swapKey(address newKey, address validator) public onlyKeysManager {
- removeValidator(validator, false);
- addValidator(newKey, false);
- fireEvent();
- }
- function getValidators() public view returns(address[]) {
- return validators;
- }
- }
Add Comment
Please, Sign In to add comment