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


---

# 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.paladin.vote/quest-v2/smart-contracts-v2/questboard.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.
