From 8ade918905f10aafdae8f17aa127001c9fe853b8 Mon Sep 17 00:00:00 2001 From: Jongseung Lim Date: Mon, 5 Dec 2022 07:37:55 -0500 Subject: [PATCH] Add external/public functions in the main meta swap contract --- contracts/interfaces/IGauge.sol | 2 ++ contracts/meta/MetaSwapGaugeSupportV1.sol | 10 ++++++++++ contracts/xchainGauges/GaugeTokenHolder.sol | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/contracts/interfaces/IGauge.sol b/contracts/interfaces/IGauge.sol index c0f62b8a..89dbbaa9 100644 --- a/contracts/interfaces/IGauge.sol +++ b/contracts/interfaces/IGauge.sol @@ -15,4 +15,6 @@ interface IGauge { function SDL() external view returns (address); function FACTORY() external view returns (address); + + function set_rewards_receiver(address) external; } diff --git a/contracts/meta/MetaSwapGaugeSupportV1.sol b/contracts/meta/MetaSwapGaugeSupportV1.sol index db683f9a..10177f07 100644 --- a/contracts/meta/MetaSwapGaugeSupportV1.sol +++ b/contracts/meta/MetaSwapGaugeSupportV1.sol @@ -450,4 +450,14 @@ contract MetaSwapGaugeSupportV1 is SwapV2, GaugeTokenHolder { maxBurnAmount ); } + + /** + * @notice Sets the reward receiver for the gauge rewards. + * @param _rewardReceiver the address to receive the gauge rewards + * @dev Both the SDL gauge reward and the third party rewards will be + * forwarded to this address. + */ + function setRewardReceiver(address _rewardReceiver) external onlyOwner { + GaugeTokenHolder._setRewardReceiver(_rewardReceiver); + } } diff --git a/contracts/xchainGauges/GaugeTokenHolder.sol b/contracts/xchainGauges/GaugeTokenHolder.sol index 41f8db1b..50d6d0cf 100644 --- a/contracts/xchainGauges/GaugeTokenHolder.sol +++ b/contracts/xchainGauges/GaugeTokenHolder.sol @@ -50,6 +50,9 @@ abstract contract GaugeTokenHolder { /// If a rewardReceiver is set, the reward token is forwarded to the /// rewardReceiver. Otherwise, the reward token is kept. function _claim() internal { + address _gaugeToken = gaugeToken; + require(_gaugeToken != address(0), "gaugeToken address not set"); + address _rewardToken = rewardToken; address _minter = minter; @@ -58,17 +61,27 @@ abstract contract GaugeTokenHolder { uint256 amount = IERC20(_rewardToken).balanceOf(address(this)); emit Claimed(amount); + // If a rewardReceiver is set, forward the reward token to the rewardReceiver address _rewardReceiver = rewardReceiver; - if (_rewardReceiver != address(0)) { IERC20(_rewardToken).safeTransfer(_rewardReceiver, amount); emit Forwarded(_rewardReceiver, amount); } } + /// @notice Claim the reward token from the associated Minter contract. + /// If a rewardReceiver is set, the reward token is forwarded to the + /// rewardReceiver. Otherwise, the reward token is kept. + function claimGaugeRewards() public virtual { + _claim(); + } + function _setRewardReceiver(address _rewardReceiver) internal { address oldRewardReceiver = rewardReceiver; rewardReceiver = _rewardReceiver; emit RewardReceiverUpdated(oldRewardReceiver, _rewardReceiver); + + // Set reward receiver for the gauge's third party rewards as well + IGauge(gaugeToken).set_rewards_receiver(_rewardReceiver); } }