// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract yHaaSRelayer {
address public owner;
address public governance;
mapping(address => bool) public keepers;
constructor() {
owner = msg.sender;
governance = msg.sender;
}
function harvestStrategy(address _strategyAddress) public onlyKeepers returns (uint256 profit, uint256 loss) {
(profit, loss) = StrategyAPI(_strategyAddress).report();
}
function tendStrategy(address _strategyAddress) public onlyKeepers {
StrategyAPI(_strategyAddress).tend();
}
function processReport(address _vaultAddress, address _strategyAddress) public onlyKeepers returns (uint256 gain, uint256 loss) {
(gain, loss) = VaultAPI(_vaultAddress).process_report(_strategyAddress);
}
function forwardCall(address debtAllocatorAddress, bytes memory data) public onlyKeepers returns (bool success) {
(success, ) = debtAllocatorAddress.call(data);
}
function setKeeper(address _address, bool _allowed) external virtual onlyAuthorized {
keepers[_address] = _allowed;
}
/**
@notice Changes the `owner` address.
@param _owner The new address to assign as `owner`.
*/
function setOwner(address _owner) external onlyAuthorized {
require(_owner != address(0));
owner = _owner;
}
/**
@notice Changes the `governance` address.
@param _governance The new address to assign as `governance`.
*/
function setGovernance(address _governance) external onlyGovernance {
require(_governance != address(0));
governance = _governance;
}
modifier onlyKeepers() {
require(msg.sender == owner || keepers[msg.sender] == true || msg.sender == governance, "!keeper yHaaSProxy");
_;
}
modifier onlyAuthorized() {
require(msg.sender == owner || msg.sender == governance, "!authorized");
_;
}
modifier onlyGovernance() {
require(msg.sender == governance, "!governance");
_;
}
}
interface StrategyAPI {
function tend() external;
function report() external returns (uint256 _profit, uint256 _loss);
}
interface VaultAPI {
function process_report(address) external returns (uint256 _gain, uint256 _loss);
}
{
"compilationTarget": {
"yHaaSRelayer.sol": "yHaaSRelayer"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"debtAllocatorAddress","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"forwardCall","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strategyAddress","type":"address"}],"name":"harvestStrategy","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"},{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"keepers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"},{"internalType":"address","name":"_strategyAddress","type":"address"}],"name":"processReport","outputs":[{"internalType":"uint256","name":"gain","type":"uint256"},{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategyAddress","type":"address"}],"name":"tendStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"}]