# Linear Vesting Airdrop

Sui Tears[💧](https://emojipedia.org/droplet) Airdrop modules are "pulled" based. The modules store the root of a Merkle tree that consists of the address of the user and the airdrop amount.  Users are required to submit a Merkle proof to claim their airdrops. The leafs are constructed by hashing (sha3256) the sender's address with the amount. This module returns the airdrop inside a linear vesting airdrop wallet. <br>

Please check [here](https://github.com/interest-protocol/suitears/blob/main/utils/src/airdrop-tree.ts) on how to construct the Merkle Tree.

## Structs

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

```rust
struct Airdrop<phantom T> has key, store { 
    id: UID,
    balance: Balance<T>,
    root: vector<u8>,
    start: u64, 
    duration: u64,
    map: Bitmap
}
```

* **balance** - Coins to airdrop
* **root** - The root of the Merkle tree
* **start** - The timestamp in which the vesting schedule starts.
* **duration** -  The duration of the vesting schedule.&#x20;
* **map** - Bitmap keeps track of airdrop claims. &#x20;

## Interface

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

**Creates a linear vested airdrop.**

```rust
public fun new<T>(airdrop_coin: Coin<T>, root: vector<u8>, start: u64, duration: u64, c: &Clock, ctx: &mut TxContext): Airdrop<T>
```

* **@param airdrop\_coin:** The coin that will be distributed in the airdrop.
* **@param root:** The Merkle tree root that keeps track of all the airdrops.
* **@param start:** The start timestamp of the vesting schedule.
* **@param duration:** The duration of the vesting schedule.
* **@param c:** The `sui::clock::Clock` shared object.&#x20;
* **@return** Airdrop\<T>

**Aborts**

* root is empty.&#x20;
* start time of the airdrop is in the past.&#x20;

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

**Returns the current amount of airdrop coins in the Airdrop object.**&#x20;

```rust
public fun balance<T>(self: &Airdrop<T>): u64
```

* **@param:** self The shared Airdrop object
* **@return** u64&#x20;

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

**Returns the root of the Merkle tree for the airdrop.**

```rust
public fun root<T>(self: &Airdrop<T>): vector<u8>
```

* **@param:** self The shared Airdrop object.
* **@return** vector\<u8>.&#x20;

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

**Returns the start timestamp of the airdrop. Users can claim after this date.**

```rust
public fun start<T>(self: &Airdrop<T>): u64
```

* **@param:** self The shared Airdrop object.
* **@return** u64.&#x20;

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

**Returns the duration of the vesting schedule.**

```rust
public fun duration<T>(self: &Airdrop<T>): u64
```

* **@param:** self The shared Airdrop object.
* **@return** u64.&#x20;

### <mark style="color:blue;">borrow\_map</mark>

**Returns an immutable reference of the Bitmap. It keeps track of the claimed airdrops.**

```rust
public fun borrow_map<T>(self: &Airdrop<T>): &Bitmap
```

* **@param:** self The shared Airdrop object.
* **@return** \&Bitmap.

### <mark style="color:blue;">has\_account\_claimed</mark>

**Checks if a user has already claimed his airdrop.**

```rust
public fun has_account_claimed<T>(
    self: &Airdrop<T>, 
    proof: vector<vector<u8>>, 
    amount: u64, 
    user: address
  ): bool
```

* **@param self:** The shared Airdrop object.
* **@param proof:** The proof that the sender can redeem the `amount` from the airdrop.
* **@param amount:** Number of coins the sender can redeem.
* **@param address:** A user address.
* **@return** bool. True if he has claimed the airdrop already.

**Aborts**

* If the `proof` is not valid.

### <mark style="color:blue;">get\_airdrop</mark>

**Allows a user to claim his airdrop by proving that his address and amount are in the Merkle tree.**

```rust
  public fun get_airdrop<T>(
    self: &mut Airdrop<T>,
    proof: vector<vector<u8>>,  
    clock_object: &Clock,
    amount: u64, 
    ctx: &mut TxContext
  ): Wallet<T>
```

* **@param self:** The shared Airdrop object.
* **@param proof:** The proof that the sender can redeem the `amount` from the airdrop.
* **@param c:** The `sui::clock::Clock` shared object.&#x20;
* **@param amount:** Number of coins the sender can redeem.
* **@return** Wallet. The airdrop Coin locked in a linear vested {Wallet}.

**Aborts**

* If the `proof` is not valid.
* The user already claimed it

### <mark style="color:blue;">destroy\_zero</mark>

**Destroys an empty Airdrop.**

```rust
public fun destroy_zero<T>(self: Airdrop<T>)
```

* **@param self:** The shared {Airdrop} object.

**Aborts**

* The `self` has left over coins.


---

# 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.interestprotocol.com/overview/deprecated/sui-tears/airdrop/linear-vesting-airdrop.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.
