diff --git a/contracts/avalanche/connectors/aave/automation-v3/events.sol b/contracts/avalanche/connectors/aave/automation-v3/events.sol new file mode 100644 index 00000000..8b3042c2 --- /dev/null +++ b/contracts/avalanche/connectors/aave/automation-v3/events.sol @@ -0,0 +1,11 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +contract Events { + event LogCancelAutomation(); + + event LogSubmitAutomation(uint256 safeHF, uint256 thresholdHF); + + event LogUpdateAutomation(uint256 safeHF, uint256 thresholdHF); +} diff --git a/contracts/avalanche/connectors/aave/automation-v3/interfaces.sol b/contracts/avalanche/connectors/aave/automation-v3/interfaces.sol new file mode 100644 index 00000000..9c1945f1 --- /dev/null +++ b/contracts/avalanche/connectors/aave/automation-v3/interfaces.sol @@ -0,0 +1,25 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +interface InstaAaveAutomation { + function submitAutomationRequest( + uint256 safeHealthFactor, + uint256 thresholdHealthFactor + ) external; + + function cancelAutomationRequest() external; + + function updateAutomation( + uint256 safeHealthFactor, + uint256 thresholdHealthFactor + ) external; +} + +interface AccountInterface { + function enable(address) external; + + function disable(address) external; + + function isAuth(address) external view returns (bool); +} diff --git a/contracts/avalanche/connectors/aave/automation-v3/main.sol b/contracts/avalanche/connectors/aave/automation-v3/main.sol new file mode 100644 index 00000000..7949c862 --- /dev/null +++ b/contracts/avalanche/connectors/aave/automation-v3/main.sol @@ -0,0 +1,84 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +/** + * @title InstaAutomation + * @dev Insta-Aave-v3-Automation + */ + +import "./events.sol"; +import "./interfaces.sol"; + +abstract contract Resolver is Events { + InstaAaveAutomation internal immutable automation = + InstaAaveAutomation(0x7eE533CB0642f18191D2927bdA735c3830B355BB); // TODO: update + + function submitAutomationRequest( + uint256 safeHealthFactor, + uint256 thresholdHealthFactor + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + bool isAuth = AccountInterface(address(this)).isAuth( + address(automation) + ); + + if (!isAuth) + AccountInterface(address(this)).enable(address(automation)); + + automation.submitAutomationRequest( + safeHealthFactor, + thresholdHealthFactor + ); + + (_eventName, _eventParam) = ( + "LogSubmitAutomation(uint256,uint256)", + abi.encode(safeHealthFactor, thresholdHealthFactor) + ); + } + + function cancelAutomationRequest() + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + automation.cancelAutomationRequest(); + + bool isAuth = AccountInterface(address(this)).isAuth( + address(automation) + ); + + if (isAuth) + AccountInterface(address(this)).disable(address(automation)); + + (_eventName, _eventParam) = ("LogCancelAutomation()", "0x"); + } + + function updateAutomationRequest( + uint256 safeHealthFactor, + uint256 thresholdHealthFactor + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + automation.cancelAutomationRequest(); + + automation.submitAutomationRequest( + safeHealthFactor, + thresholdHealthFactor + ); + + (_eventName, _eventParam) = ( + "LogUpdateAutomation(uint256,uint256)", + abi.encode(safeHealthFactor, thresholdHealthFactor) + ); + } +} + +contract ConnectV2InstaAaveV3Automation is Resolver { + string public constant name = "Insta-Aave-V3-Automation-v1"; +}