# Key Roles

## Admin

Our Lender, Redeemer and MarketPlace contract rely on an `admin` to control certain aspects. They are described on a contract basis below.

### Lender

In the Lender contract, the `admin` has the following privileges:

* `approve`: the admin is responsible for executing the approval of the redeemer contract. This is necessary to facilitate the usage of Principal Tokens by the Redeemer
* `setAdmin`: the admin is the only one that can transfer admin powers
* `setFee`: the admin can see a fee rate. This fee rate has a minimum value (which limits the amount of fees extracted per transaction)
* `setMarketPlace`: the admin can set the MarketPlace contract
* `scheduleWithdrawal` and `scheduleFeeChange`: the admin can schedule these actions (there is a 3 day holding period)
* `blockWithdrawal` and `blockFeeChange`: the admin may block fee changes and withdrawals
* `withdrawFee`: the admin may withdraw fees from the contract. The amount extractable from the contract is limited by the `fees` mapping
* `withdraw`: the admin may withdraw the entire balance of the token (this is an emergency measure)
* `pause`: the admin may pause certain markets. This may be necessary in the event that an integrated principal token experiences insolvency or their own pauses

### Redeemer

In the Redeemer contract, the `admin` has the following privileges:

* `setAdmin`: the admin is the only one that can transfer admin powers
* `setMarketPlace`: the admin can set the MarketPlace contract
* `setConverter`: the admin can set the Converter contract
* `setLender`: the admin can set the Lender contract
* `setFee`: the admin can see a fee rate for automatic redemptions. This fee rate has a minimum value (which limits the amount of fees extracted per transaction)
* `pauseRedemptions`: the admin may pause the redemption process. This is an emergency measure

### MarketPlace

In the MarketPlace contract, the `admin` has the following privileges:

* `createMarket`: the admin can create new markets
* `setPrincipal`: the admin can add principal tokens to a market if one has not already been set for the protocol
* `setPool`: the admin can set a Yield Space Pool for swapping Illuminate principal tokens and the underlying
* `setAdmin`: the admin is the only one that can transfer admin powers

## Lenders

These are the users of the protocol. They will be able to use Illuminate to arbitrage fixed rates markets and lend conveniently via our protocol and API.

### Lender

* `lend`: this method will swap underlying assets for Illuminate's principal tokens in a given market
* `mint`: this method will mint Illuminate principal tokens in exchange for principal tokens
* `batch`: this method allows the user to chain multiple `lend` and `mint` calls together efficiently

### Redeemer

* `redeem`: this method allows the user to swap their Illuminate principal tokens for the underlying asset after maturity

### MarketPlace

* `sellPrincipalToken`: allows user to swap Illuminate principal tokens for the underlying asset prior to maturity
* `buyPrincipalToken`: allows user to swap underlying tokens for Illuminate principal tokens
* `sellUnderlying`: allows user to swap underlying tokens for Illuminate principal tokens
* `buyUnderlying`: allows user to swap Illuminate principal tokens for underlying tokens
* `batch`: this method allows the user to chain multiple swap methods together efficiently

###
