# Quest

This module wraps an object labeled as rewards that can only be unwrapped if a set of witness objects are passed as arguments to the complete function. A witness is a struct with the drop key. The idea is to have a user complete a set of tasks for a reward in different protocols . The protocols certify that the user completed the task via their Witnesses.

## Structs

### <mark style="color:blue;">**Quest**</mark>

```rust
struct Quest<Reward: store> has key, store {
    id: UID,
    required_tasks: VecSet<TypeName>,
    completed_tasks: VecSet<TypeName>,
    reward: Reward,
 }
```

* **required\_tasks** - Stores the Witnesses of all required tasks.
* **completed\_tasks** - Contains all the Witnesses the user must complete to unwrap the {Reward}.
* **reward** - An object that will be returned once the Quest has been completed.

## Interface

### <mark style="color:blue;">new</mark>

**Creates a {Quest} .**

```rust
public fun new<Reward: store>(
  required_tasks: VecSet<TypeName>, 
  reward: Reward, 
  ctx: &mut TxContext
): Quest<Reward>
```

* **@param required\_tasks:** A vector set of the required tasks to unlock the `reward`.
* **@param reward:** An object with the store ability that can be redeemed once all tasks are completed.
* **@return** Quest\<Reward>.&#x20;

### <mark style="color:blue;">required\_tasks</mark>

**Returns the required tasks of the `self`.**

```rust
public fun required_tasks<Reward: store>(self: &Quest<Reward>): vector<TypeName>
```

* **@param self:** A {Quest}.
* **@return** vector\<TypeName>. A vector of the required Witness names to complete the quest.

### <mark style="color:blue;">completed\_tasks</mark>

**Returns the completed tasks of the `self`.**

```rust
public fun required_tasks<Reward: store>(self: &Quest<Reward>): vector<TypeName>
```

* **@param self:** A {Quest}.
* **@return** vector\<TypeName>. A vector of the completed Witness names to complete the quest.

### <mark style="color:blue;">complete</mark>

**Completes a quest by adding the witness `Task` name to the `self.completed_tasks` vector.**

```rust
public fun complete<Reward: store, Task: drop>(self: &mut Quest<Reward>, _: Task)
```

* **@param self:** A {Quest}.
* **@param:** \_ A witness `Task`.

### <mark style="color:blue;">finish</mark>

**Finishes a quest and returns the `Reward` to the caller.**

```rust
public fun complete<Reward: store, Task: drop>(self: &mut Quest<Reward>, _: Task)
```

* **@param self:** A {Quest}.
* **@return:** Reward.

**Aborts**

* If the required\_tasks do not match the completed\_tasks
