# 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 concatenated with the amount. <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, 
    map: Bitmap
}
```

* **balance** - Coins to airdrop
* **root** - The root of the Merkle tree
* **start** - The timestamp in which users can claim the airdrop
* **map** - Bitmap keeps track of airdrop claims. &#x20;

## Interface

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

**It creates the Airdrop object.**

```rust
public fun new(airdrop_coin: Coin<T>, root: vector<u8>, start: 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 airdrop in milliseconds.
* **@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;">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>>, 
    c: &Clock,
    amount: u64, 
    ctx: &mut TxContext
): Coin<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** Coin\<T>. The airdrop Coin.

**Aborts**

* If the `proof` is not valid.
* The airdrop has not started yet.
* The user already claimed it

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

**Destroys an empty Airdrop object.**

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

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

**Aborts**

* The `self` has left over coins.
