# 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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.convexfinance.com/convexfinanceintegration/baserewardpool.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
