From ce443792e6f8c22dd314c1fe62253a7048d4e8bc Mon Sep 17 00:00:00 2001 From: Shriya Tyagi Date: Thu, 25 Jul 2024 21:16:00 +0530 Subject: [PATCH] feat: add spark incentives contract --- .../connectors/spark-rewards/events.sol | 13 +++ .../connectors/spark-rewards/helpers.sol | 14 +++ .../connectors/spark-rewards/interface.sol | 18 ++++ .../mainnet/connectors/spark-rewards/main.sol | 94 +++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 contracts/mainnet/connectors/spark-rewards/events.sol create mode 100644 contracts/mainnet/connectors/spark-rewards/helpers.sol create mode 100644 contracts/mainnet/connectors/spark-rewards/interface.sol create mode 100644 contracts/mainnet/connectors/spark-rewards/main.sol diff --git a/contracts/mainnet/connectors/spark-rewards/events.sol b/contracts/mainnet/connectors/spark-rewards/events.sol new file mode 100644 index 0000000..ace1644 --- /dev/null +++ b/contracts/mainnet/connectors/spark-rewards/events.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +contract Events { + event LogClaimed( + address[] assets, + uint256 amt, + uint256 getId, + uint256 setId + ); + + event LogAllClaimed(address[] assets, address[] rewards, uint256[] amts); +} diff --git a/contracts/mainnet/connectors/spark-rewards/helpers.sol b/contracts/mainnet/connectors/spark-rewards/helpers.sol new file mode 100644 index 0000000..8d69d4f --- /dev/null +++ b/contracts/mainnet/connectors/spark-rewards/helpers.sol @@ -0,0 +1,14 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +import {DSMath} from "../../common/math.sol"; +import {Basic} from "../../common/basic.sol"; +import {SparkIncentivesInterface} from "./interface.sol"; + +abstract contract Helpers is DSMath, Basic { + /** + * @dev Spark Incentives + */ + SparkIncentivesInterface internal constant SPARK_INCENTIVES = + SparkIncentivesInterface(0x8164Cc65827dcFe994AB23944CBC90e0aa80bFcb); +} diff --git a/contracts/mainnet/connectors/spark-rewards/interface.sol b/contracts/mainnet/connectors/spark-rewards/interface.sol new file mode 100644 index 0000000..2ac62fd --- /dev/null +++ b/contracts/mainnet/connectors/spark-rewards/interface.sol @@ -0,0 +1,18 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +interface SparkIncentivesInterface { + function claimRewards( + address[] calldata assets, + uint256 amount, + address to, + address reward + ) external returns (uint256); + + function claimAllRewards( + address[] calldata assets, + address to + ) + external + returns (address[] memory rewardsList, uint256[] memory claimedAmounts); +} diff --git a/contracts/mainnet/connectors/spark-rewards/main.sol b/contracts/mainnet/connectors/spark-rewards/main.sol new file mode 100644 index 0000000..30e9d6b --- /dev/null +++ b/contracts/mainnet/connectors/spark-rewards/main.sol @@ -0,0 +1,94 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.2; + +/** + * @title Spark Rewards. + * @dev Claim spark rewards. + */ + +import {TokenInterface} from "../../common/interfaces.sol"; +import {Stores} from "../../common/stores.sol"; +import {Helpers} from "./helpers.sol"; +import {Events} from "./events.sol"; + +abstract contract IncentivesConnector is Helpers, Events { + /** + * @dev Claim Pending Rewards. + * @notice Claim Pending Rewards from Spark incentives contract. + * @param assets The list of assets supplied and borrowed. + * @param amt The amount of reward to claim. (uint(-1) for max) + * @param reward The address of reward token to claim. + * @param getId ID to retrieve amt. + * @param setId ID stores the amount of rewards claimed. + */ + function claim( + address[] calldata assets, + uint256 amt, + address reward, + uint256 getId, + uint256 setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(getId, amt); + + require(assets.length > 0, "invalid-assets"); + + TokenInterface weth = TokenInterface(wethAddr); + uint256 wethAmountBefore = weth.balanceOf(address(this)); + + _amt = SPARK_INCENTIVES.claimRewards( + assets, + _amt, + address(this), + reward + ); + + uint256 wethAmountDiff = weth.balanceOf(address(this)) - + wethAmountBefore; + convertWethToEth(wethAmountDiff > 0, weth, wethAmountDiff); + + setUint(setId, _amt); + + _eventName = "LogClaimed(address[],uint256,uint256,uint256)"; + _eventParam = abi.encode(assets, _amt, getId, setId); + } + + /** + * @dev Claim All Pending Rewards. + * @notice Claim All Pending Rewards from Spark incentives contract. + * @param assets The list of assets supplied and borrowed. + */ + function claimAll( + address[] calldata assets + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + require(assets.length > 0, "invalid-assets"); + uint256[] memory _amts = new uint256[](assets.length); + address[] memory _rewards = new address[](assets.length); + + TokenInterface weth = TokenInterface(wethAddr); + uint256 wethAmountBefore = weth.balanceOf(address(this)); + + (_rewards, _amts) = SPARK_INCENTIVES.claimAllRewards( + assets, + address(this) + ); + + uint256 wethAmountDiff = weth.balanceOf(address(this)) - + wethAmountBefore; + convertWethToEth(wethAmountDiff > 0, weth, wethAmountDiff); + + _eventName = "LogAllClaimed(address[],address[],uint256[])"; + _eventParam = abi.encode(assets, _rewards, _amts); + } +} + +contract ConnectV2SparkIncentives is IncentivesConnector { + string public constant name = "Spark-Incentives-v1"; +}