# QuestBoard

### Storage

#### GAUGE\_CONTROLLER

```solidity
address GAUGE_CONTROLLER
```

Address of the Curve Gauge Controller

#### nextID

```solidity
uint256 nextID
```

ID for the next Quest to be created

#### quests

```solidity
mapping(uint256 => struct IQuestBoard.Quest) quests
```

List of Quest (indexed by ID)

#### periodsByQuest

```solidity
mapping(uint256 => mapping(uint256 => struct IQuestBoard.QuestPeriod)) periodsByQuest
```

Mapping of all QuestPeriod struct for each period of each Quest

#### questDistributors

```solidity
mapping(uint256 => address) questDistributors
```

Mapping of Distributors used by each Quest to send rewards

#### questWithdrawableAmount

```solidity
mapping(uint256 => uint256) questWithdrawableAmount
```

Amount not distributed, for Quest creators to redeem

#### platformFeeRatio

```solidity
uint256 platformFeeRatio
```

Platform fees ratio (in BPS)

#### customPlatformFeeRatio

```solidity
mapping(address => uint256) customPlatformFeeRatio
```

Mapping of specific fee ratio for some Quest creators

#### objectiveMinimalThreshold

```solidity
uint256 objectiveMinimalThreshold
```

Minimum Objective required

#### questChest

```solidity
address questChest
```

Address of the Chest to receive platform fees

#### distributor

```solidity
address distributor
```

Address of the reward Distributor contract

#### biasCalculator

```solidity
address biasCalculator
```

Address of the Bias Calculator Module

#### approvedManagers

```solidity
mapping(address => bool) approvedManagers
```

Mapping of addresses allowed to call manager methods

#### whitelistedTokens

```solidity
mapping(address => bool) whitelistedTokens
```

Whitelisted tokens that can be used as reward tokens

#### minRewardPerVotePerToken

```solidity
mapping(address => uint256) minRewardPerVotePerToken
```

Min rewardPerVote per token (to avoid spam creation of useless Quest)

#### isKilled

```solidity
bool isKilled
```

Boolean, true if the cotnract was killed, stopping main user functions

#### killTs

```solidity
uint256 killTs
```

Timestamp when the contract was killed

### Structs

#### QuestPeriod

```solidity
struct QuestPeriod {
    uint256 rewardAmountPerPeriod;
    uint256 minRewardPerVote;
    uint256 maxRewardPerVote;
    uint256 minObjectiveVotes;
    uint256 maxObjectiveVotes;
    uint256 rewardAmountDistributed;
    uint48 periodStart;
    QuestDataTypes.PeriodState currentState;
}
```

Struct for a Period of a Quest

* rewardAmountPerPeriod : Total reward amount that can be distributed for that period
* minRewardPerVote : Min Amount of reward for each vote (for 1 veToken)
* maxRewardPerVote : Max Amount of reward for each vote (for 1 veToken)
* minObjectiveVotes : Min Target Bias for the Gauge
* maxObjectiveVotes : Max Target Bias for the Gauge
* rewardAmountDistributed : Amount of reward to distribute, at period closing
* periodStart : Timestamp of the Period start
* currentState : Current state of the Period

#### Quest

```solidity
struct Quest {
    address creator;
    address rewardToken;
    address gauge;
    uint48 duration;
    uint48 periodStart;
    uint256 totalRewardAmount;
    QuestTypes types;
}
```

Struct holding the parameters of the Quest common for all periods

* creator : Address of the Quest creator
* rewardToken : Address of the ERC20 used for rewards
* gauge : Address of the target Gauge
* duration : Total number of periods for the Quest
* periodStart : Timestamp where the 1st QuestPeriod starts
* totalRewardAmount : Total amount of rewards paid for this Quest
* types : Quest Types

#### QuestTypes

```solidity
struct QuestTypes {
    QuestDataTypes.QuestVoteType voteType;
    QuestDataTypes.QuestRewardsType rewardsType;
    QuestDataTypes.QuestCloseType closeType;
}
```

Struct with all the Quest types

### Events

#### Init

```solidity
event Init(address distributor, address biasCalculator)
```

Event emitted when the Board is Initialized

#### NewQuest

```solidity
event NewQuest(uint256 questID, address creator, address gauge, address rewardToken, uint48 duration, uint256 startPeriod)
```

Event emitted when a new Quest is created

#### ExtendQuestDuration

```solidity
event ExtendQuestDuration(uint256 questID, uint256 addedDuration, uint256 addedRewardAmount)
```

Event emitted when the Quest duration is extended

#### UpdateQuestParameters

```solidity
event UpdateQuestParameters(uint256 questID, uint256 updatePeriod, uint256 newMinRewardPerVote, uint256 newMaxRewardPerVote, uint256 addedPeriodRewardAmount)
```

Event emitted when a Quest parameters are updated

#### WithdrawUnusedRewards

```solidity
event WithdrawUnusedRewards(uint256 questID, address recipient, uint256 amount)
```

Event emitted when Quest creator withdraw undistributed rewards

#### PeriodClosed

```solidity
event PeriodClosed(uint256 questID, uint256 period)
```

Event emitted when a Period is Closed

#### PeriodBiasFixed

```solidity
event PeriodBiasFixed(uint256 questID, uint256 period, uint256 newBias)
```

Event emitted when a Period Bias is fixed

#### WhitelistToken

```solidity
event WhitelistToken(address token, uint256 minRewardPerVote)
```

Event emitted when a new reward token is whitelisted

#### UpdateRewardToken

```solidity
event UpdateRewardToken(address token, uint256 newMinRewardPerVote)
```

Event emitted when a reward token parameter is updated

#### Killed

```solidity
event Killed(uint256 killTime)
```

Event emitted when the contract is killed

#### Unkilled

```solidity
event Unkilled(uint256 unkillTime)
```

Event emitted when the contract is unkilled

#### EmergencyWithdraw

```solidity
event EmergencyWithdraw(uint256 questID, address recipient, uint256 amount)
```

Event emitted when the Quest creator withdraw all unused funds (if the contract was killed)

#### ApprovedManager

```solidity
event ApprovedManager(address manager)
```

Event emitted when a new manager is approved

#### RemovedManager

```solidity
event RemovedManager(address manager)
```

Event emitted when a manager is removed

#### ChestUpdated

```solidity
event ChestUpdated(address oldChest, address newChest)
```

Event emitted when the Chest address is updated

#### SetCustomFeeRatio

```solidity
event SetCustomFeeRatio(address creator, uint256 customFeeRatio)
```

Event emitted when a custom fee ratio is set for a given address

#### DistributorUpdated

```solidity
event DistributorUpdated(address oldDistributor, address newDistributor)
```

Event emitted when the Distributor address is updated

#### PlatformFeeRatioUpdated

```solidity
event PlatformFeeRatioUpdated(uint256 oldFeeRatio, uint256 newFeeRatio)
```

Event emitted when the fee ratio is updated

#### MinObjectiveUpdated

```solidity
event MinObjectiveUpdated(uint256 oldMinObjective, uint256 newMinObjective)
```

Event emitted when the minimum objective of votes is updated

### Modifiers

#### onlyAllowed

```solidity
modifier onlyAllowed()
```

Check the caller is either the admin or an approved manager

#### isAlive

```solidity
modifier isAlive()
```

Check that contract was not killed

#### isInitialized

```solidity
modifier isInitialized()
```

Check that contract was initialized

### Constructor

```solidity
constructor(address _gaugeController, address _chest) public
```

#### init

```solidity
function init(address _distributor, address _biasCalculator) external
```

Initialize the contract

**Parameters**

| Name             | Type    | Description                    |
| ---------------- | ------- | ------------------------------ |
| \_distributor    | address | Address of the Distributor     |
| \_biasCalculator | address | Address of the Bias Calculator |

### View Methods

#### getCurrentPeriod

```solidity
function getCurrentPeriod() public view returns (uint256)
```

Returns the current Period for the contract

*Returns the current Period for the contract*

#### getQuestIdsForPeriod

```solidity
function getQuestIdsForPeriod(uint256 period) external view returns (uint256[])
```

Returns the list of all Quest IDs active on a given period

*Returns the list of all Quest IDs active on a given period*

**Parameters**

| Name   | Type    | Description             |
| ------ | ------- | ----------------------- |
| period | uint256 | Timestamp of the period |

**Return Values**

| Name | Type       | Description                           |
| ---- | ---------- | ------------------------------------- |
| \[0] | uint256\[] | uint256\[] : Quest IDs for the period |

#### getQuestIdsForPeriodForGauge

```solidity
function getQuestIdsForPeriodForGauge(address gauge, uint256 period) external view returns (uint256[])
```

Returns the list of all Quest IDs active on a given period

*Returns the list of all Quest IDs active on a given period*

**Parameters**

| Name   | Type    | Description             |
| ------ | ------- | ----------------------- |
| gauge  | address |                         |
| period | uint256 | Timestamp of the period |

**Return Values**

| Name | Type       | Description                           |
| ---- | ---------- | ------------------------------------- |
| \[0] | uint256\[] | uint256\[] : Quest IDs for the period |

#### getAllPeriodsForQuestId

```solidity
function getAllPeriodsForQuestId(uint256 questId) external view returns (uint48[])
```

Returns all periods for a Quest

*Returns all period timestamps for a Quest ID*

**Parameters**

| Name    | Type    | Description     |
| ------- | ------- | --------------- |
| questId | uint256 | ID of the Quest |

**Return Values**

| Name | Type      | Description                            |
| ---- | --------- | -------------------------------------- |
| \[0] | uint48\[] | uint256\[] : List of period timestamps |

#### getAllQuestPeriodsForQuestId

```solidity
function getAllQuestPeriodsForQuestId(uint256 questId) external view returns (struct IQuestBoard.QuestPeriod[])
```

Returns all QuestPeriod of a given Quest

*Returns all QuestPeriod of a given Quest ID*

**Parameters**

| Name    | Type    | Description     |
| ------- | ------- | --------------- |
| questId | uint256 | ID of the Quest |

**Return Values**

| Name | Type                              | Description                           |
| ---- | --------------------------------- | ------------------------------------- |
| \[0] | struct IQuestBoard.QuestPeriod\[] | QuestPeriod\[] : list of QuestPeriods |

#### \_getRemainingDuration

```solidity
function _getRemainingDuration(uint256 questID) internal view returns (uint256)
```

Returns the number of periods to come for a given Quest

*Returns the number of periods to come for a given Quest*

**Parameters**

| Name    | Type    | Description     |
| ------- | ------- | --------------- |
| questID | uint256 | ID of the Quest |

**Return Values**

| Name | Type    | Description                                    |
| ---- | ------- | ---------------------------------------------- |
| \[0] | uint256 | uint : remaining duration (non active periods) |

#### getCurrentReducedBias

```solidity
function getCurrentReducedBias(uint256 questID) external view returns (uint256)
```

Returns the current reduced bias of a gauge for a given Quest

*Returns the current reduced bias of a gauge for a given Quest*

**Parameters**

| Name    | Type    | Description     |
| ------- | ------- | --------------- |
| questID | uint256 | ID of the Quest |

**Return Values**

| Name | Type    | Description                                 |
| ---- | ------- | ------------------------------------------- |
| \[0] | uint256 | uint256 : current reduced bias of the gauge |

#### getQuestCreator

```solidity
function getQuestCreator(uint256 questID) external view returns (address)
```

Returns the address of the Quest creator

*Returns the address of the Quest creator*

**Parameters**

| Name    | Type    | Description     |
| ------- | ------- | --------------- |
| questID | uint256 | ID of the Quest |

**Return Values**

| Name | Type    | Description                    |
| ---- | ------- | ------------------------------ |
| \[0] | address | address : creator of the Quest |

### State-changing Methods

#### createFixedQuest

```solidity
function createFixedQuest(address gauge, address rewardToken, bool startNextPeriod, uint48 duration, uint256 rewardPerVote, uint256 totalRewardAmount, uint256 feeAmount, enum QuestDataTypes.QuestVoteType voteType, enum QuestDataTypes.QuestCloseType closeType, address[] voterList) external returns (uint256)
```

Creates a fixed rewards Quest based on the given parameters

*Creates a Quest based on the given parameters & the given types with the Fixed Rewards type*

**Parameters**

| Name              | Type                               | Description                                                          |
| ----------------- | ---------------------------------- | -------------------------------------------------------------------- |
| gauge             | address                            | Address of the gauge                                                 |
| rewardToken       | address                            | Address of the reward token                                          |
| startNextPeriod   | bool                               | (bool) true to start the Quest the next period                       |
| duration          | uint48                             | Duration of the Quest (in weeks)                                     |
| rewardPerVote     | uint256                            | Amount of reward/vote (in wei)                                       |
| totalRewardAmount | uint256                            | Total amount of rewards available for the full Quest duration        |
| feeAmount         | uint256                            | Amount of fees paid at creation                                      |
| voteType          | enum QuestDataTypes.QuestVoteType  | Vote type for the Quest                                              |
| closeType         | enum QuestDataTypes.QuestCloseType | Close type for the Quest                                             |
| voterList         | address\[]                         | List of voters for the Quest (to be used for Blacklist or Whitelist) |

**Return Values**

| Name | Type    | Description                             |
| ---- | ------- | --------------------------------------- |
| \[0] | uint256 | uint256 : ID of the newly created Quest |

#### createRangedQuest

```solidity
function createRangedQuest(address gauge, address rewardToken, bool startNextPeriod, uint48 duration, uint256 minRewardPerVote, uint256 maxRewardPerVote, uint256 totalRewardAmount, uint256 feeAmount, enum QuestDataTypes.QuestVoteType voteType, enum QuestDataTypes.QuestCloseType closeType, address[] voterList) external returns (uint256)
```

Creates a ranged rewards Quest based on the given parameters

*Creates a Quest based on the given parameters & the given types with the Ranged Rewards type*

**Parameters**

| Name              | Type                               | Description                                                          |
| ----------------- | ---------------------------------- | -------------------------------------------------------------------- |
| gauge             | address                            | Address of the gauge                                                 |
| rewardToken       | address                            | Address of the reward token                                          |
| startNextPeriod   | bool                               | (bool) true to start the Quest the next period                       |
| duration          | uint48                             | Duration of the Quest (in weeks)                                     |
| minRewardPerVote  | uint256                            | Minimum amount of reward/vote (in wei)                               |
| maxRewardPerVote  | uint256                            | Maximum amount of reward/vote (in wei)                               |
| totalRewardAmount | uint256                            | Total amount of rewards available for the full Quest duration        |
| feeAmount         | uint256                            | Amount of fees paid at creation                                      |
| voteType          | enum QuestDataTypes.QuestVoteType  | Vote type for the Quest                                              |
| closeType         | enum QuestDataTypes.QuestCloseType | Close type for the Quest                                             |
| voterList         | address\[]                         | List of voters for the Quest (to be used for Blacklist or Whitelist) |

**Return Values**

| Name | Type    | Description                             |
| ---- | ------- | --------------------------------------- |
| \[0] | uint256 | uint256 : ID of the newly created Quest |

#### \_createQuest

```solidity
function _createQuest(address gauge, address rewardToken, struct IQuestBoard.QuestTypes types, bool startNextPeriod, uint48 duration, uint256 minRewardPerVote, uint256 maxRewardPerVote, uint256 totalRewardAmount, uint256 feeAmount, address[] voterList) internal returns (uint256 newQuestID)
```

Creates a Quest based on the given parameters

*Creates a Quest based on the given parameters & the given types*

**Parameters**

| Name              | Type                          | Description                                                          |
| ----------------- | ----------------------------- | -------------------------------------------------------------------- |
| gauge             | address                       | Address of the gauge                                                 |
| rewardToken       | address                       | Address of the reward token                                          |
| types             | struct IQuestBoard.QuestTypes | Quest Types (Rewards, Vote & Close)                                  |
| startNextPeriod   | bool                          | (bool) true to start the Quest the next period                       |
| duration          | uint48                        | Duration of the Quest (in weeks)                                     |
| minRewardPerVote  | uint256                       | Minimum amount of reward/vote (in wei)                               |
| maxRewardPerVote  | uint256                       | Maximum amount of reward/vote (in wei)                               |
| totalRewardAmount | uint256                       | Total amount of rewards available for the full Quest duration        |
| feeAmount         | uint256                       | Amount of fees paid at creation                                      |
| voterList         | address\[]                    | List of voters for the Quest (to be used for Blacklist or Whitelist) |

**Return Values**

| Name       | Type    | Description                               |
| ---------- | ------- | ----------------------------------------- |
| newQuestID | uint256 | (uint256) : ID of the newly created Quest |

#### extendQuestDuration

```solidity
function extendQuestDuration(uint256 questID, uint48 addedDuration, uint256 addedRewardAmount, uint256 feeAmount) external
```

Increases the duration of a Quest

*Adds more QuestPeriods and extends the duration of a Quest*

**Parameters**

| Name              | Type    | Description                                          |
| ----------------- | ------- | ---------------------------------------------------- |
| questID           | uint256 | ID of the Quest                                      |
| addedDuration     | uint48  | Number of period to add                              |
| addedRewardAmount | uint256 | Amount of reward to add for the new periods (in wei) |
| feeAmount         | uint256 | Platform fees amount (in wei)                        |

#### updateQuestParameters

```solidity
function updateQuestParameters(uint256 questID, uint256 newMinRewardPerVote, uint256 newMaxRewardPerVote, uint256 addedPeriodRewardAmount, uint256 addedTotalRewardAmount, uint256 feeAmount) external
```

Updates the parametes of the Quest

*Updates the reward/vote parameters, allowing to update the Quest objectives too*

**Parameters**

| Name                    | Type    | Description                                      |
| ----------------------- | ------- | ------------------------------------------------ |
| questID                 | uint256 | ID of the Quest                                  |
| newMinRewardPerVote     | uint256 | New min reward/vote value (in wei)               |
| newMaxRewardPerVote     | uint256 | New max reward/vote value (in wei)               |
| addedPeriodRewardAmount | uint256 | Amount of reward to add for each period (in wei) |
| addedTotalRewardAmount  | uint256 | Amount of reward to add for all periods (in wei) |
| feeAmount               | uint256 | Platform fees amount (in wei)                    |

#### withdrawUnusedRewards

```solidity
function withdrawUnusedRewards(uint256 questID, address recipient) external
```

Withdraw all undistributed rewards from Closed Quest Periods

*Withdraw all undistributed rewards from Closed Quest Periods*

**Parameters**

| Name      | Type    | Description                          |
| --------- | ------- | ------------------------------------ |
| questID   | uint256 | ID of the Quest                      |
| recipient | address | Address to send the reward tokens to |

#### emergencyWithdraw

```solidity
function emergencyWithdraw(uint256 questID, address recipient) external
```

Emergency withdraws all undistributed rewards from Closed Quest Periods & all rewards for Active Periods

*Emergency withdraws all undistributed rewards from Closed Quest Periods & all rewards for Active Periods*

**Parameters**

| Name      | Type    | Description                          |
| --------- | ------- | ------------------------------------ |
| questID   | uint256 | ID of the Quest                      |
| recipient | address | Address to send the reward tokens to |

### Internal Methods

#### \_getFeeRatio

```solidity
function _getFeeRatio(address questCreator) internal view returns (uint256)
```

Get the fee ratio for a given Quest creator

*Returns the custom fee ratio for a Quest creator if set, otherwise returns the general fee ratio*

**Parameters**

| Name         | Type    | Description                  |
| ------------ | ------- | ---------------------------- |
| questCreator | address | address of the Quest creator |

**Return Values**

| Name | Type    | Description         |
| ---- | ------- | ------------------- |
| \[0] | uint256 | uint256 : fee ratio |

#### \_getDistributionAmount

```solidity
function _getDistributionAmount(enum QuestDataTypes.QuestRewardsType questRewardType, uint256 periodBias, struct IQuestBoard.QuestPeriod _questPeriod) internal pure returns (uint256)
```

Gets the amount of rewards to be distributed for the period

*Gets the amount of rewards to be distributed for the*

**Parameters**

| Name            | Type                                 | Description                                                |
| --------------- | ------------------------------------ | ---------------------------------------------------------- |
| questRewardType | enum QuestDataTypes.QuestRewardsType | Rewards type for the Quest                                 |
| periodBias      | uint256                              | Bias of the gauge (reduced if nedded) for the given period |
| \_questPeriod   | struct IQuestBoard.QuestPeriod       | Data for the Quest Period                                  |

**Return Values**

| Name | Type    | Description                        |
| ---- | ------- | ---------------------------------- |
| \[0] | uint256 | uint256 : Amount to be distributed |

#### \_handleUndistributedRewards

```solidity
function _handleUndistributedRewards(uint256 questID, uint256 currentPeriod, enum QuestDataTypes.QuestCloseType questCloseType, address rewardToken, uint256 undistributedAmount) internal
```

Handles the Quest period undistributed rewards

*Handles the Quest period undistributed rewards based on the Quest Close type*

**Parameters**

| Name                | Type                               | Description                                       |
| ------------------- | ---------------------------------- | ------------------------------------------------- |
| questID             | uint256                            | ID of the Quest                                   |
| currentPeriod       | uint256                            | Timestamp of the current period                   |
| questCloseType      | enum QuestDataTypes.QuestCloseType | Close type for the Quest                          |
| rewardToken         | address                            | Address of the reward token                       |
| undistributedAmount | uint256                            | Amount of token not distributed for voter rewards |

#### \_closeQuestPeriod

```solidity
function _closeQuestPeriod(uint256 period, uint256 questID) internal returns (bool)
```

Closes the Period, and all QuestPeriods for this period

*Closes all QuestPeriod for the given period, calculating rewards to distribute & send them to distributor*

**Parameters**

| Name    | Type    | Description             |
| ------- | ------- | ----------------------- |
| period  | uint256 | Timestamp of the period |
| questID | uint256 |                         |

### Manager Methods

#### closeQuestPeriod

```solidity
function closeQuestPeriod(uint256 period) external returns (uint256 closed, uint256 skipped)
```

Closes the Period, and all QuestPeriods for this period

*Closes all QuestPeriod for the given period, calculating rewards to distribute & send them to distributor*

**Parameters**

| Name   | Type    | Description             |
| ------ | ------- | ----------------------- |
| period | uint256 | Timestamp of the period |

#### closePartOfQuestPeriod

```solidity
function closePartOfQuestPeriod(uint256 period, uint256[] questIDs) external returns (uint256 closed, uint256 skipped)
```

Closes the given QuestPeriods for the Period

*Closes the given QuestPeriods for the Period, calculating rewards to distribute & send them to distributor*

**Parameters**

| Name     | Type       | Description                    |
| -------- | ---------- | ------------------------------ |
| period   | uint256    | Timestamp of the period        |
| questIDs | uint256\[] | List of the Quest IDs to close |

#### \_addMerkleRoot

```solidity
function _addMerkleRoot(uint256 questID, uint256 period, uint256 totalAmount, bytes32 merkleRoot) internal
```

*Sets the QuestPeriod as disitrbuted, and adds the MerkleRoot to the Distributor contract*

**Parameters**

| Name        | Type    | Description                            |
| ----------- | ------- | -------------------------------------- |
| questID     | uint256 | ID of the Quest                        |
| period      | uint256 | Timestamp of the period                |
| totalAmount | uint256 | sum of all rewards for the Merkle Tree |
| merkleRoot  | bytes32 | MerkleRoot to add                      |

#### addMerkleRoot

```solidity
function addMerkleRoot(uint256 questID, uint256 period, uint256 totalAmount, bytes32 merkleRoot) external
```

Sets the QuestPeriod as disitrbuted, and adds the MerkleRoot to the Distributor contract

\_internal call to *addMerkleRoot()*

**Parameters**

| Name        | Type    | Description                            |
| ----------- | ------- | -------------------------------------- |
| questID     | uint256 | ID of the Quest                        |
| period      | uint256 | Timestamp of the period                |
| totalAmount | uint256 | sum of all rewards for the Merkle Tree |
| merkleRoot  | bytes32 | MerkleRoot to add                      |

#### addMultipleMerkleRoot

```solidity
function addMultipleMerkleRoot(uint256[] questIDs, uint256 period, uint256[] totalAmounts, bytes32[] merkleRoots) external
```

Sets a list of QuestPeriods as disitrbuted, and adds the MerkleRoot to the Distributor contract for each

\_Loop and internal call to *addMerkleRoot()*

**Parameters**

| Name         | Type       | Description                                     |
| ------------ | ---------- | ----------------------------------------------- |
| questIDs     | uint256\[] | List of Quest IDs                               |
| period       | uint256    | Timestamp of the period                         |
| totalAmounts | uint256\[] | List of sums of all rewards for the Merkle Tree |
| merkleRoots  | bytes32\[] | List of MerkleRoots to add                      |

#### whitelistToken

```solidity
function whitelistToken(address newToken, uint256 minRewardPerVote) public
```

Whitelists a reward token

*Whitelists a reward token*

**Parameters**

| Name             | Type    | Description                                               |
| ---------------- | ------- | --------------------------------------------------------- |
| newToken         | address | Address of the reward token                               |
| minRewardPerVote | uint256 | Minimal threshold of reward per vote for the reward token |

#### whitelistMultipleTokens

```solidity
function whitelistMultipleTokens(address[] newTokens, uint256[] minRewardPerVotes) external
```

Whitelists a list of reward tokens

*Whitelists a list of reward tokens*

**Parameters**

| Name              | Type       | Description                                                       |
| ----------------- | ---------- | ----------------------------------------------------------------- |
| newTokens         | address\[] | List of reward tokens addresses                                   |
| minRewardPerVotes | uint256\[] | List of minimal threshold of reward per vote for the reward token |

#### updateRewardToken

```solidity
function updateRewardToken(address newToken, uint256 newMinRewardPerVote) external
```

Updates a reward token parameters

*Updates a reward token parameters*

**Parameters**

| Name                | Type    | Description                                                   |
| ------------------- | ------- | ------------------------------------------------------------- |
| newToken            | address | Address of the reward token                                   |
| newMinRewardPerVote | uint256 | New minimal threshold of reward per vote for the reward token |

### Admin Methods

#### fixQuestPeriodBias

```solidity
function fixQuestPeriodBias(uint256 period, uint256 questID, uint256 correctReducedBias) external
```

Approves a new address as manager

*Approves a new address as manager*

**Parameters**

| Name               | Type    | Description                                  |
| ------------------ | ------- | -------------------------------------------- |
| period             | uint256 | Timestamp fo the period to fix               |
| questID            | uint256 | ID of the Quest                              |
| correctReducedBias | uint256 | Currect bias to be used for the Quest period |

#### approveManager

```solidity
function approveManager(address newManager) external
```

Approves a new address as manager

*Approves a new address as manager*

**Parameters**

| Name       | Type    | Description    |
| ---------- | ------- | -------------- |
| newManager | address | Address to add |

#### removeManager

```solidity
function removeManager(address manager) external
```

Removes an address from the managers

*Removes an address from the managers*

**Parameters**

| Name    | Type    | Description       |
| ------- | ------- | ----------------- |
| manager | address | Address to remove |

#### updateChest

```solidity
function updateChest(address chest) external
```

Updates the Chest address

*Updates the Chest address*

**Parameters**

| Name  | Type    | Description              |
| ----- | ------- | ------------------------ |
| chest | address | Address of the new Chest |

#### updateDistributor

```solidity
function updateDistributor(address newDistributor) external
```

Updates the Distributor address

*Updates the Distributor address*

**Parameters**

| Name           | Type    | Description                    |
| -------------- | ------- | ------------------------------ |
| newDistributor | address | Address of the new Distributor |

#### updatePlatformFee

```solidity
function updatePlatformFee(uint256 newFee) external
```

Updates the Platfrom fees BPS ratio

*Updates the Platfrom fees BPS ratio*

**Parameters**

| Name   | Type    | Description   |
| ------ | ------- | ------------- |
| newFee | uint256 | New fee ratio |

#### updateMinObjective

```solidity
function updateMinObjective(uint256 newMinObjective) external
```

Updates the min objective value

*Updates the min objective value*

**Parameters**

| Name            | Type    | Description       |
| --------------- | ------- | ----------------- |
| newMinObjective | uint256 | New min objective |

#### setCustomFeeRatio

```solidity
function setCustomFeeRatio(address user, uint256 customFeeRatio) external
```

Sets a custom fee ratio for a given address

*Sets a custom fee ratio for a given address*

**Parameters**

| Name           | Type    | Description      |
| -------------- | ------- | ---------------- |
| user           | address | User address     |
| customFeeRatio | uint256 | Custom fee ratio |

#### recoverERC20

```solidity
function recoverERC20(address token) external returns (bool)
```

Recovers ERC2O tokens sent by mistake to the contract

*Recovers ERC2O tokens sent by mistake to the contract*

**Parameters**

| Name  | Type    | Description                |
| ----- | ------- | -------------------------- |
| token | address | Address tof the EC2O token |

**Return Values**

| Name | Type | Description   |
| ---- | ---- | ------------- |
| \[0] | bool | bool: success |

#### killBoard

```solidity
function killBoard() external
```

Kills the contract

*Kills the contract*

#### unkillBoard

```solidity
function unkillBoard() external
```

Unkills the contract

*Unkills the contract*

### Maths

#### safe48

```solidity
function safe48(uint256 n) internal pure returns (uint48)
```
