# MultiMerkleDistributorV2

#### questRewardToken

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

Mapping listing the reward token associated to each Quest ID

#### rewardTokens

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

Mapping of tokens this contract is or was distributing

#### questClosedPeriods

```solidity
mapping(uint256 => uint256[]) questClosedPeriods
```

List of Closed QuestPeriods by Quest ID

#### questMerkleRootPerPeriod

```solidity
mapping(uint256 => mapping(uint256 => bytes32)) questMerkleRootPerPeriod
```

Merkle Root for each period of a Quest (indexed by Quest ID)

#### questRewardsPerPeriod

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

Amount of rewards for each period of a Quest (indexed by Quest ID)

#### questBoard

```solidity
address questBoard
```

Address of the QuestBoard contract

#### lootCreator

```solidity
address lootCreator
```

Address of the Loot Creator contract

#### Claimed

```solidity
event Claimed(uint256 questID, uint256 period, uint256 index, uint256 amount, address rewardToken, address account)
```

Event emitted when a user Claims

#### NewQuest

```solidity
event NewQuest(uint256 questID, address rewardToken)
```

Event emitted when a New Quest is added

#### QuestPeriodUpdated

```solidity
event QuestPeriodUpdated(uint256 questID, uint256 period, bytes32 merkleRoot)
```

Event emitted when a Period of a Quest is updated (when the Merkle Root is added)

#### LootCreatorUpdated

```solidity
event LootCreatorUpdated(address oldCreator, address newCreator)
```

Event emitted when the Loot Creator address is updated

#### isClaimed

```solidity
function isClaimed(uint256 questID, uint256 period, uint256 index) public view returns (bool)
```

Checks if the rewards were claimed for a user on a given period

**Parameters**

| Name    | Type    | Description                    |
| ------- | ------- | ------------------------------ |
| questID | uint256 | ID of the Quest                |
| period  | uint256 | Amount of underlying to borrow |
| index   | uint256 | Index of the claim             |

**Return Values**

| Name | Type | Description                    |
| ---- | ---- | ------------------------------ |
| \[0] | bool | bool : true if already claimed |

#### claim

```solidity
function claim(uint256 questID, uint256 period, uint256 index, address account, uint256 amount, bytes32[] merkleProof) public
```

Claims the reward for a user for a given period of a Quest

**Parameters**

| Name        | Type       | Description                              |
| ----------- | ---------- | ---------------------------------------- |
| questID     | uint256    | ID of the Quest                          |
| period      | uint256    | Timestamp of the period                  |
| index       | uint256    | Index in the Merkle Tree                 |
| account     | address    | Address of the user claiming the rewards |
| amount      | uint256    | Amount of rewards to claim               |
| merkleProof | bytes32\[] | Proof to claim the rewards               |

#### ClaimParams

```solidity
struct ClaimParams {
  uint256 questID;
  uint256 period;
  uint256 index;
  uint256 amount;
  bytes32[] merkleProof;
}
```

#### multiClaim

```solidity
function multiClaim(address account, struct MultiMerkleDistributorV2.ClaimParams[] claims) external
```

Claims multiple rewards for a given list

**Parameters**

| Name    | Type                                           | Description                              |
| ------- | ---------------------------------------------- | ---------------------------------------- |
| account | address                                        | Address of the user claiming the rewards |
| claims  | struct MultiMerkleDistributorV2.ClaimParams\[] | List of ClaimParams struct data to claim |

#### claimQuest

```solidity
function claimQuest(address account, uint256 questID, struct MultiMerkleDistributorV2.ClaimParams[] claims) external
```

Claims the reward for all the given periods of a Quest, and transfer all the rewards at once

**Parameters**

| Name    | Type                                           | Description                              |
| ------- | ---------------------------------------------- | ---------------------------------------- |
| account | address                                        | Address of the user claiming the rewards |
| questID | uint256                                        | ID of the Quest                          |
| claims  | struct MultiMerkleDistributorV2.ClaimParams\[] | List of ClaimParams struct data to claim |

#### getClosedPeriodsByQuests

```solidity
function getClosedPeriodsByQuests(uint256 questID) external view returns (uint256[])
```

Returns all current Closed periods for the given Quest ID

**Parameters**

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

**Return Values**

| Name | Type       | Description                         |
| ---- | ---------- | ----------------------------------- |
| \[0] | uint256\[] | uint256\[] : List of closed periods |

#### addQuest

```solidity
function addQuest(uint256 questID, address token) external returns (bool)
```

Adds a new Quest to the listing

**Parameters**

| Name    | Type    | Description                       |
| ------- | ------- | --------------------------------- |
| questID | uint256 | ID of the Quest                   |
| token   | address | Address of the ERC20 reward token |

**Return Values**

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

#### addQuestPeriod

```solidity
function addQuestPeriod(uint256 questID, uint256 period, uint256 totalRewardAmount) external returns (bool)
```

Adds a new period & the rewards of this period for a Quest

**Parameters**

| Name              | Type    | Description                                          |
| ----------------- | ------- | ---------------------------------------------------- |
| questID           | uint256 | ID of the Quest                                      |
| period            | uint256 | Timestamp of the period                              |
| totalRewardAmount | uint256 | Total amount of rewards to distribute for the period |

**Return Values**

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

#### fixQuestPeriod

```solidity
function fixQuestPeriod(uint256 questID, uint256 period, uint256 newTotalRewardAmount) external returns (bool)
```

#### updateQuestPeriod

```solidity
function updateQuestPeriod(uint256 questID, uint256 period, uint256 totalAmount, bytes32 merkleRoot) external returns (bool)
```

Updates the period of a Quest by adding the Merkle Root

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

**Return Values**

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