> For the complete documentation index, see [llms.txt](https://docs.interestprotocol.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.interestprotocol.com/overview/deprecated/sui-tears/airdrop/linear-vesting-airdrop.md).

# 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.
