# MultiVault

#### **`deposit`**

Transfer tokens to the Everscale.\
Works both for native and alien tokens. Approve is required only for alien tokens deposit.

```
function deposit(
        EverscaleAddress memory recipient,
        address token,
        uint amount
    ) external override nonReentrant
        tokenNotBlacklisted(token)
        initializeToken(token) onlyEmergencyDisabled
```

**Parameters:**

| Name      | Type                    | Description                  |
| --------- | ----------------------- | ---------------------------- |
| recipient | EverscaleAddress memory | Everscale recipient          |
| token     | address                 | EVM token address            |
| amount    | uint                    | Amount of tokens to transfer |

**Events emitted:**

* Deposit

#### **`saveWithdrawNative`**

Saves withdrawal for native token (does the necessary checks regarding token and chain, calculates fees and mints).

```
function saveWithdrawNative(
        bytes memory payload,
        bytes[] memory signatures
    ) external override nonReentrant
        withdrawalNotSeenBefore(payload) onlyEmergencyDisabled
```

**Parameters:**

| Name       | Type            | Description        |
| ---------- | --------------- | ------------------ |
| payload    | bytes memory    | Withdraw payload   |
| signatures | bytes\[] memory | List of signatures |

**Events emitted:**

* Withdraw

#### **`saveWithdrawAlien`**

Saves withdrawal for alien token (does the necessary checks regarding token and chain, calculates fees and mints).

```
function saveWithdrawAlien(
        bytes memory payload,
        bytes[] memory signatures
    )
        external
        override
        nonReentrant
        withdrawalNotSeenBefore(payload)
        onlyEmergencyDisabled
```

**Parameters:**

| Name       | Type            | Description                                          |
| ---------- | --------------- | ---------------------------------------------------- |
| payload    | bytes memory    | Withdraw payload (later processed to EverscaleEvent) |
| signatures | bytes\[] memory | List of signatures                                   |

**Events emitted:**

* Withdraw

#### **`skim`**

Skim (removes) multivault fees for specific token. If `skim_to_everscale` is true, than fees will be sent to Everscale. Otherwise, tokens will be transferred to the `governance` address.

```
function skim(
        address token,
        bool skim_to_everscale
    ) external override nonReentrant onlyGovernanceOrManagement
```

**Parameters:**

| Name                | Type    | Description                                  |
| ------------------- | ------- | -------------------------------------------- |
| token               | address | Token address, can be both native or alien   |
| skim\_to\_everscale | bool    | Are skim fees applicable on Everscale or not |

**Events emitted:**

* SkimFee

#### **`migrateAlienTokenToVault`**

Transfers specified token to specified vault.

```
function migrateAlienTokenToVault(
        address token,
        address vault
    ) external override onlyGovernance
```

**Parameters:**

| Name  | Type    | Description                                |
| ----- | ------- | ------------------------------------------ |
| token | address | Address of alien token                     |
| vault | address | Vault address where to migrate alien token |

**Events emitted:**

* TokenMigrated

#### **`calculateMovementFee`**

Calculates fee for deposit or withdrawal.

```
function calculateMovementFee(
        uint256 amount,
        address _token,
        Fee fee
    ) public view returns (uint256)
```

**Parameters:**

| Name    | Type    | Description                          |
| ------- | ------- | ------------------------------------ |
| amount  | uint256 | Amount of tokens to deposit/withdraw |
| \_token | address | Token address                        |
| fee     | Fee     | Fee type (Deposit=0, Withdraw=1)     |

**Return value:**

| Type    | Description                |
| ------- | -------------------------- |
| uint256 | Fee for deposit/withdrawal |

#### **`_activateToken`**

Activates specified token with all the information about it.

```
function _activateToken(
        address token,
        bool isNative
    ) internal
```

**Parameters:**

| Name     | Type    | Description                  |
| -------- | ------- | ---------------------------- |
| token    | address | Token address                |
| isNative | bool    | True if native, false if not |

**Events emitted:**

* TokenActivated

#### **`_transferToEverscaleNative`**

Emits NativeTransfer event to signify native token transfer to Everscale network.

```
function _transferToEverscaleNative(
        address _token,
        EverscaleAddress memory recipient,
        uint amount
    ) internal
```

**Parameters:**

| Name      | Type                    | Description                  |
| --------- | ----------------------- | ---------------------------- |
| \_token   | address                 | Native token address         |
| recipient | EverscaleAddress memory | Everscale recipient data     |
| amount    | uint                    | Amount of tokens to transfer |

**Events emitted:**

* NativeTransfer

#### **`_transferToEverscaleAlien`**

Emits AlienTransfer event to signify alien token transfer to Everscale network.

```
function _transferToEverscaleAlien(
        address _token,
        EverscaleAddress memory recipient,
        uint amount
    ) internal
```

**Parameters:**

| Name      | Type                    | Description                  |
| --------- | ----------------------- | ---------------------------- |
| \_token   | address                 | Alien token address          |
| recipient | EverscaleAddress memory | Everscale recipient data     |
| amount    | uint                    | Amount of tokens to transfer |

**Events emitted:**

* AlienTransfer

#### **`_getNativeWithdrawalToken`**

Gets the native token based on provided parameters, deploys and activates it if it isn't already active.

```
function _getNativeWithdrawalToken(
        NativeWithdrawalParams memory withdrawal
    ) internal returns (address token)
```

**Parameters:**

| Name       | Type                          | Description                                                    |
| ---------- | ----------------------------- | -------------------------------------------------------------- |
| withdrawal | NativeWithdrawalParams memory | Native withdrawal token data (includes workchain id, address…) |

#### **`_deployTokenForNative`**

Deploys token as native.

```
function _deployTokenForNative(
        EverscaleAddress memory native,
        TokenMeta memory meta
    ) internal returns (address token)
```

**Parameters:**

| Name   | Type                    | Description                       |
| ------ | ----------------------- | --------------------------------- |
| native | EverscaleAddress memory | Everscale address data            |
| meta   | TokenMeta memory        | Meta data of token to be deployed |

**Return value:**

| Name  | Type    | Description               |
| ----- | ------- | ------------------------- |
| token | address | Address of deployed token |

**Events emitted:**

* TokenCreated

#### **`_processWithdrawEvent`**

Process' withdraw event by verifying signatures and decoding the event and checking the event configuration.

```
function _processWithdrawEvent(
        bytes memory payload,
        bytes[] memory signatures,
        EverscaleAddress memory configuration
    ) internal view returns (EverscaleEvent memory)
```

**Parameters:**

| Name          | Type                    | Description                                       |
| ------------- | ----------------------- | ------------------------------------------------- |
| payload       | bytes memory            | EverscaleEvent data encoded to bytes              |
| signatures    | bytes\[] memory         | List of signatures                                |
| configuration | EverscaleAddress memory | Everscale address data needed for required checks |

**Return value:**

| Type           | Description                 |
| -------------- | --------------------------- |
| EverscaleEvent | New withdraw EverscaleEvent |
