# TreasuryProtectionStrategy

Contract that implement protection strategy using a whitelist. 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/TreasuryProtectionStrategy.sol>" %}

### Variables

* `protectedAddresses`

#### protectedAddresses

A mapping of addresses and their protection rules.

### Events

* `event WhitelistAddresses(address[] whitelist)`

### Functions

* `isAddressWhitelisted`
* `isTransferAllowed`
* `setProtectedAddress`
* `removeProtectedAddresses`

#### isAddressWhitelisted

```solidity
function isAddressWhitelisted(address token, address protectedAddress, address whitelistedAddress) public view returns(bool)
```

Returns true if particular `whitelistedAddress` is in the whitelist of `protectedAddress` for `token`.

Parameters:

| Name                 | Type    | Description                                             |
| -------------------- | ------- | ------------------------------------------------------- |
| `token`              | address | Token for which the protection rules are being checked. |
| `protectedAddress`   | address | Address for which the whitelist is being checked.       |
| `whitelistedAddress` | address | Address to check if it's in the whitelist.              |

#### isTransferAllowed

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

Reverts in case transfer from sender to recipient is not possible due to recipient not being in the sender's whitelist. This is called by the lossless controller every time a transfer is done from the protected address.&#x20;

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

#### setProtectedAddress

```solidity
function setProtectedAddress(address token, address protectedAddress, address[] calldata whitelist) public onlyProtectionAdmin(token)
```

Sets a whitelist for the protected address inside one particular token's scope. Can be called only by the protection admin of a token.

Parameters:

| Name               | Type       | Description                                                                        |
| ------------------ | ---------- | ---------------------------------------------------------------------------------- |
| `token`            | address    | Token for which the protection rules are being checked.                            |
| `protectedAddress` | address    | Address for which the protection rules should be applied.                          |
| `whitelist`        | address\[] | A list of addresses that are allowed to receive tokens from the protected address. |

#### removeProtectedAddresses

```solidity
function removeProtectedAddresses(address token, address[] calldata addressesToRemove) public onlyProtectionAdmin(token) 
```

Removes whitelist from the addresses in the list.&#x20;

Parameters:

| Name                | Type       | Description                                                |
| ------------------- | ---------- | ---------------------------------------------------------- |
| `token`             | address    | Token for which the protection rules are being removed.    |
| `addressesToRemove` | address\[] | A list of address that should get their whitelist removed. |
