# Rewards

The [BaseRewardPool.sol](https://github.com/convex-eth/platform/blob/main/contracts/contracts/BaseRewardPool.sol) contract is used as the main reward contract for all LP pools.

```javascript
//sample convex reward contracts interface
interface IConvexRewards{
    //get balance of an address
    function balanceOf(address _account) external returns(uint256);
    //withdraw to a convex tokenized deposit
    function withdraw(uint256 _amount, bool _claim) external returns(bool);
    //withdraw directly to curve LP token
    function withdrawAndUnwrap(uint256 _amount, bool _claim) external returns(bool);
    //claim rewards
    function getReward() external returns(bool);
    //stake a convex tokenized deposit
    function stake(uint256 _amount) external returns(bool);
    //stake a convex tokenized deposit for another address(transfering ownership)
    function stakeFor(address _account,uint256 _amount) external returns(bool);
}
```

### Token Type of Reward

Use `baseRewardPool.rewardToken()` to determine what token is rewarded

### Balance of an Account

Use `baseRewardPool.balanceOf(address)` to see how much an address has staked.

### Total Staked Amount

Use `baseRewardPool.totalSupply()` to see how much is currently staked on the reward contract

### Current Earned Rewards

Use `baseRewardPool.earned(address)` to see how much rewards an address will receive if they claim their rewards now.

### Claim Rewards

Use baseRewardPool.getReward() or baseRewardPool.getReward( address, bool ) to claim rewards for your address or an arbitrary address.  The bool is an option to also claim extra incentive tokens (ex. snx) which is defaulted to true in the non-parametrized version. More information on extra rewards below.

### Stake/Deposit Tokens

Use `baseRewardPool.stake( amount )` to stake a given amount for your address\
Use `baseRewardPool.stakeAll()` to stake all tokens for your address\
Use `baseRewardPool.stakeFor( address, amount )` to stake on behalf of another address (*\*This transfers ownership of the tokens!*)

### Unstake/Withdraw Tokens

Use `baseRewardPool.withdraw( amount, bool )` to withdraw a specific amount. bool is to also claim while withdrawing\
Use `baseRewardPool.withdrawAll( bool )` to withdraw all tokens staked. bool is to also claim while withdrawing\
Use `baseRewardPool.withdrawAndUnwrap( amount, bool )` to withdraw a specific amount of tokens AND also unwrap the tokens back into the underlying LP tokens. bool is to also claim while withdrawing\
Use `baseRewardPool.withdrawAllAndUnwrap(bool claim)` to withdraw all tokens AND also unwrap the tokens back into the underlying LP tokens. bool is to also claim while withdrawing

### Extra Rewards

The BaseRewardPool has an array of child reward contracts called extraRewards.\
You can query the number of extra rewards via `baseRewardPool.extraRewardsLength()`.\
This array holds a list of [VirtualBalanceRewardPool ](https://github.com/convex-eth/platform/blob/main/contracts/contracts/VirtualBalanceRewardPool.sol)contracts which are similar in nature to the base reward contract but without actual control of staked tokens.\
\
This means that if a pool has CRV rewards **as well as** SNX rewards, the pool's main reward contract(BaseRewardPool) will distribute the CRV and the child contract(VirtualBalanceRewardPool) will distribute the SNX.

{% hint style="info" %}
Important for pools with IDs 151+:

VirtualBalanceRewardPool's rewardToken points to a wrapped version of the underlying token.  This Token implementation can be found here: <https://github.com/convex-eth/platform/blob/main/contracts/contracts/StashTokenWrapper.sol>

A staking implementation example handling these wrappers can be found at: <https://github.com/convex-eth/platform/blob/main/contracts/contracts/wrappers/ConvexStakingWrapper.sol>
{% endhint %}

### Other Information

The reward contract mechanics are that of popular synthetix style reward contract.\
Some important parameters for determining things like APY could be:\
**duration**: The reward contract cycle length\
**periodFinish**: When the current cycle is planned to finish\
**rewardRate**: How many tokens are distributed per second\
&#x20;

<br>
