all files / contracts/peripherals/keepers/ Keep3rKeeperDisputable.sol

0% Statements 0/10
0% Branches 0/6
0% Functions 0/3
0% Lines 0/10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43                                                                                     
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4 <0.9.0;
 
import './Keep3rKeeperFundable.sol';
import '../Keep3rDisputable.sol';
import '../../../interfaces/external/IKeep3rV1.sol';
import '../../../interfaces/peripherals/IKeep3rKeepers.sol';
 
abstract contract Keep3rKeeperDisputable is IKeep3rKeeperDisputable, Keep3rDisputable, Keep3rKeeperFundable {
  using EnumerableSet for EnumerableSet.AddressSet;
  using SafeERC20 for IERC20;
 
  /// @inheritdoc IKeep3rKeeperDisputable
  function slash(
    address _keeper,
    address _bonded,
    uint256 _amount
  ) public override onlySlasher {
    if (!disputes[_keeper]) revert NotDisputed();
    _slash(_keeper, _bonded, _amount);
    emit KeeperSlash(_keeper, msg.sender, _amount);
  }
 
  /// @inheritdoc IKeep3rKeeperDisputable
  function revoke(address _keeper) external override onlySlasher {
    if (!disputes[_keeper]) revert NotDisputed();
    _keepers.remove(_keeper);
    _slash(_keeper, keep3rV1, bonds[_keeper][keep3rV1]);
    emit KeeperRevoke(_keeper, msg.sender);
  }
 
  function _slash(
    address _keeper,
    address _bonded,
    uint256 _amount
  ) internal {
    if (_bonded != keep3rV1) {
      try IERC20(_bonded).transfer(governance, _amount) returns (bool) {} catch (bytes memory) {}
    }
    bonds[_keeper][_bonded] -= _amount;
  }
}