55 lines
1.6 KiB
Solidity
55 lines
1.6 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "./PriceFeedKeeper.sol";
|
|
|
|
/**
|
|
* @title GelatoKeeperCompatible
|
|
* @notice Gelato Network compatible keeper for PriceFeedKeeper
|
|
* @dev Implements Gelato's task execution pattern
|
|
*/
|
|
contract GelatoKeeperCompatible {
|
|
PriceFeedKeeper public immutable keeper;
|
|
address public immutable gelato;
|
|
|
|
event TaskExecuted(address indexed executor, address[] assets, uint256 timestamp);
|
|
|
|
constructor(address keeperAddress, address gelato_) {
|
|
keeper = PriceFeedKeeper(keeperAddress);
|
|
gelato = gelato_;
|
|
}
|
|
|
|
/**
|
|
* @notice Gelato task execution function
|
|
* @dev Called by Gelato executors
|
|
*/
|
|
function executeTask() external {
|
|
require(msg.sender == gelato, "GelatoKeeperCompatible: only Gelato");
|
|
|
|
(bool needsUpdate, address[] memory assets) = keeper.checkUpkeep();
|
|
|
|
if (needsUpdate && assets.length > 0) {
|
|
keeper.updateAssets(assets);
|
|
emit TaskExecuted(msg.sender, assets, block.timestamp);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @notice Check if task can be executed
|
|
* @return canExec True if task can be executed
|
|
* @return execData Encoded execution data
|
|
*/
|
|
function canExec() external view returns (bool canExec, bytes memory execData) {
|
|
(bool needsUpdate, address[] memory assets) = keeper.checkUpkeep();
|
|
|
|
if (needsUpdate && assets.length > 0) {
|
|
canExec = true;
|
|
execData = abi.encodeWithSelector(this.executeTask.selector);
|
|
} else {
|
|
canExec = false;
|
|
execData = "";
|
|
}
|
|
}
|
|
}
|
|
|