Skip to content

Commit

Permalink
Merge pull request #485 from moonwell-fi/feat/curve-multi-rewarder
Browse files Browse the repository at this point in the history
CRV MultiRewarder Contract
  • Loading branch information
ElliotFriedman authored Mar 6, 2025
2 parents 383516f + 99700a5 commit 4bdfd89
Show file tree
Hide file tree
Showing 7 changed files with 1,846 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .github/actions/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ runs:
run: forge compile --contracts proposals/
shell: bash

- name: Compile MultiRewarder
run: forge compile --contracts crv-rewards/
shell: bash

- name: Compile Contracts
run: forge build
shell: bash
9 changes: 9 additions & 0 deletions .github/workflows/unit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,12 @@ jobs:
max_attempts: 3
command: time forge test -vvv --match-contract UnitTest

- name: Run MultiRewards Tests
uses: nick-fields/retry@v3
with:
polling_interval_seconds: 30
retry_wait_seconds: 60
timeout_minutes: 20
max_attempts: 3
command: time forge test --match-path test/unit/MultiRewards.t.sol -vvv

86 changes: 86 additions & 0 deletions crv-rewards/IMultiRewards.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.19;

interface IMultiRewards {
struct Reward {
address rewardsDistributor;
uint256 rewardsDuration;
uint256 periodFinish;
uint256 rewardRate;
uint256 lastUpdateTime;
uint256 rewardPerTokenStored;
}

// Events
event RewardAdded(uint256 reward);
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event RewardPaid(
address indexed user,
address indexed rewardsToken,
uint256 reward
);
event RewardsDurationUpdated(address token, uint256 newDuration);
event Recovered(address token, uint256 amount);
event OwnerNominated(address newOwner);
event OwnerChanged(address oldOwner, address newOwner);
event PauseChanged(bool isPaused);

// View functions
function owner() external view returns (address);
function nominatedOwner() external view returns (address);
function stakingToken() external view returns (address);
function rewardData(
address
)
external
view
returns (
address rewardsDistributor,
uint256 rewardsDuration,
uint256 periodFinish,
uint256 rewardRate,
uint256 lastUpdateTime,
uint256 rewardPerTokenStored
);
function rewardTokens(uint256) external view returns (address);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function lastTimeRewardApplicable(
address _rewardsToken
) external view returns (uint256);
function rewardPerToken(
address _rewardsToken
) external view returns (uint256);
function earned(
address account,
address _rewardsToken
) external view returns (uint256);
function getRewardForDuration(
address _rewardsToken
) external view returns (uint256);

// Mutative functions
function nominateNewOwner(address _owner) external;
function acceptOwnership() external;
function setPaused(bool _paused) external;
function addReward(
address _rewardsToken,
address _rewardsDistributor,
uint256 _rewardsDuration
) external;
function setRewardsDistributor(
address _rewardsToken,
address _rewardsDistributor
) external;
function stake(uint256 amount) external;
function withdraw(uint256 amount) external;
function getReward() external;
function exit() external;
function notifyRewardAmount(address _rewardsToken, uint256 reward) external;
function recoverERC20(address tokenAddress, uint256 tokenAmount) external;
function setRewardsDuration(
address _rewardsToken,
uint256 _rewardsDuration
) external;
}
Loading

0 comments on commit 4bdfd89

Please sign in to comment.