// 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; } }