# LiquidityProtectionSingleLimitStrategy

Contract that implements protection strategy using a single limit. Inherits from [StrategyBase](https://docs.lossless.io/protocol/technical-reference/vault-and-treasury-protection/strategybase).

Contract can be found here:

{% embed url="<https://github.com/Lossless-Cash/lossless-v2/blob/master/contracts/LiquidityProtectionSingleLimitStrategy.sol>" %}

### Variables

* `protection`

#### protection

A mapping of addresses and their protection rules.

### Functions

* `getLimit`
* `setLimitBatched`
* `setLimit`
* `removeLimits`
* `pause`
* `isTransferAllowed`

#### getLimit

```solidity
function getLimit(address token, address protectedAddress) external view returns(Limit memory)
```

Returns limit info for particular protected address.

Parameters:

| Name               | Type    | Description                                             |
| ------------------ | ------- | ------------------------------------------------------- |
| `token`            | address | Token for which the protection rules are being checked. |
| `protectedAddress` | address | Address for which the limit should be returned.         |

#### setLimitBatched

```solidity
function setLimitBatched(
        address token,
        address[] calldata protectedAddresses,
        uint256 periodInSeconds,
        uint256 amountPerPeriod,
        uint256 startTimestamp
    ) external onlyProtectionAdmin(token) 
```

Sets limits for a list of addresses. Can be called only by token protection admin.

Parameters:

| Name                 | Type       | Description                                             |
| -------------------- | ---------- | ------------------------------------------------------- |
| `token`              | address    | Token for which the protection rules are being applied. |
| `protectedAddresses` | address\[] | A list of addresses that should get the limit applied.  |
| `periodInSeconds`    | uint256    | Limit period.                                           |
| `amountPerPeriod`    | uint256    | Limit amount per period.                                |
| `startTimestamp`     | uint256    | Limit start time.                                       |

#### setLimit

```solidity
function setLimit(
        address token,
        address protectedAddress,
        uint256 periodInSeconds,
        uint256 amountPerPeriod,
        uint256 startTimestamp
    ) external onlyProtectionAdmin(token)
```

Sets limit for a single address. Can be called only by token protection admin.

Parameters:

| Name               | Type    | Description                                             |
| ------------------ | ------- | ------------------------------------------------------- |
| `token`            | address | Token for which the protection rules are being applied. |
| `protectedAddress` | address | Address that should get the limit applied.              |
| `periodInSeconds`  | uint256 | Limit period.                                           |
| `amountPerPeriod`  | uint256 | Limit amount per period.                                |
| `startTimestamp`   | uint256 | Limit start time.                                       |

#### removeLimits

```solidity
function removeLimits(address token, address[] calldata protectedAddresses) external onlyProtectionAdmin(token)
```

Removes limits for addresses in the list. Can be called only by token protection admin.

Parameters:

| Name                 | Type       | Description                                             |
| -------------------- | ---------- | ------------------------------------------------------- |
| `token`              | address    | Token for which the protection rules are being applied. |
| `protectedAddresses` | address\[] | Addresses that should get limits removed.               |

#### pause

```solidity
function pause(address token, address protectedAddress) external onlyProtectionAdmin(token)
```

Change limit to 0, ie, pause transfers from this address. Can be called only by token protection admin.

Parameters:

| Name               | Type    | Description                                             |
| ------------------ | ------- | ------------------------------------------------------- |
| `token`            | address | Token for which the protection rules are being applied. |
| `protectedAddress` | address | Address that should get it's limit paused.              |

#### isTransferAllowed

```solidity
function isTransferAllowed(address token, address sender, address recipient, uint256 amount) external 
```

Checks if transfer from the sender is allowed. Internally it validates if limit is not reached and updates limit info after transfer is allowed to go through.

Parameters:

| Name        | Type    | Description                                             |
| ----------- | ------- | ------------------------------------------------------- |
| `token`     | address | Token for which the protection rules are being checked. |
| `sender`    | address | Sender's address.                                       |
| `recipient` | address | Recipient's address.                                    |
| `amount`    | uint256 | Amount of tokens being transferred.                     |
