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


---

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