interface IMMStrategyHarvestKp3r {
    event Keep3rSet(address keep3r);
    event Keep3rHelperSet(address keep3rHelper);
    event SlidingOracleSet(address slidingOracle);

    // Actions by Keeper
    event HarvestedByKeeper(address _strategy);
	
    // Harvestable check
    event HarvestableCheck(address _strategy, uint256 profitTokenAmount, uint256 profitFactor, uint256 profitInEther, uint256 ethCallCost);

    // Setters
    function setKeep3r(address _keep3r) external;

    function setKeep3rHelper(address _keep3rHelper) external;

    function setSlidingOracle(address _slidingOracle) external;

    function setSushiSlidingOracle(address _sushiSlidingOracle) external;
	
    function setMinHarvestInterval(uint256 _interval) external;
	
    function setProfitFactor(uint256 _profitFactor) external;

    // Getters
    function getStrategies() external view returns (address[] memory);
    function getCollateralizedStrategies() external view returns (address[] memory);
    function getVaults() external view returns (address[] memory);

    // psuedo view method, please use something similar to below tool to query
    // https://docs.ethers.io/v5/api/contract/contract/#contract-callStatic 
    function harvestable(address _strategy) external returns (bool);

    // harvest actions for Keep3r
    function harvest(address _strategy) external;
    
    // earn() actions for Keep3r
    function earnable(address _strategy) external view returns (bool);
    function earn(address _strategy) external;
    
    // keepMinRatio() actions for Keep3r
    function keepMinRatioMayday(address _strategy) external view returns (bool);
    function keepMinRatio(address _strategy) external;

    // Name of the Keep3r
    function name() external pure returns (string memory);

    event HarvestStrategyAdded(address _vault, address _strategy, uint256 _requiredHarvest, bool _requiredKeepMinRatio, bool _requiredLeverageToMax, address yieldToken, uint256 yieldTokenOracle);

    event EarnVaultAdded(address _vault, uint256 _requiredEarnBalance);

    event HarvestStrategyModified(address _strategy, uint256 _requiredHarvest);

    event EarnVaultModified(address _vault, uint256 _requiredEarnBalance);

    event HarvestStrategyRemoved(address _strategy);

    event EarnVaultRemoved(address _vault);

    // Modifiers
    function addStrategy(address _vault, address _strategy, uint256 _requiredHarvest, bool _requiredKeepMinRatio, bool _requiredLeverageToMax, address yieldToken, uint256 yieldTokenOracle) external;
    
    function addVault(address _vault, uint256 _requiredEarnBalance) external;

    function updateRequiredHarvestAmount(address _strategy, uint256 _requiredHarvest) external;
    
    function updateYieldTokenOracle(address _strategy, uint256 _yieldTokenOracle) external;
    
    function updateRequiredEarn(address _vault, uint256 _requiredEarnBalance) external;

    function removeHarvestStrategy(address _strategy) external;

    function removeEarnVault(address _vault) external;

}
// 
function setKeep3r(address _keep3r) external;
// Setters