# sDF Design Document
[TOC]
---
## Overview
sDF is a token, similar functionality to [xSushi](https://docs.sushi.com/products/yield-farming/the-sushibar), that you receive in exchange of staking DF tokens. While holding sDF token, it will appreciate in value, as incomes from dForce eco-applictions such as lending, trading, POO, etc. The sDF token is always worth more than a regular DF token, the exchange rate will increase by a fix reward rate or periodic DF inject from profit distribution(directly inject to sDF contract to increase sDF exchange rate, therefor all sDF holders will benifit from it).
## Algorithm
In this section, we will introduce basic algotithm and functions in detail.
* ### Exchange Rate
Exchange rate is the rate of total amount of `DF` and `sDF`
$$
ExchangeRate = \frac {DF.UserDeposited + FixedRateReward + EcosystemProfit }{sDF.TotalSupply}
$$
The reward consists of two parts:
1. #### fixed rate reward
This is the $TotalUnexecutedReward$ distributed by `rewardRate` per block set by owner and the actual tokens are stored in a `RewardVault` contract, which can be executed when `sDF`'s `DF` balance is insufficient.
$$
TotalUnexecutedReward = TotalDistributed - TotalExecuted
$$
- $TotalDistributed$ is the sum of the reward of all phases. `setRewardRate` starts a new phase with a fixed reward rate.
$$
TotalDistributed = \sum rewardRate_i \times BlockDelta_i
$$
In implementation, a `startBlock` is used to indicate the start block of current phase, therefore $TotalDistributed$ looks like:
```
totalDistributed = totalDistributedSettled + rewardRate * (currentBlock - startBlock)
```
The `totalDistributedSettled` is the settled total distributed reward from the very beginning to current `startBlock`. Each `setRewardRate` triggers a settlement of the `totalDistributedSettled`, and set the `startBlock` to current one.
- $TotalExecuted$ is the sum of the reward executed from `RewardVault`. It accumulates when user leaving with `DF` and the the current `DF` balance is insuffient.
2. #### ecosystem profit
This is the profit from the dForce lending system, which will be swap into `DF` and directly transfer into the `sDF` contract from time to time.
In implementation,the `ecosystem profit` is automatically included in `sDF`'s DF balance, so the `ExchangeRate` calculation looks like:
```
exchangeRate = (DF.balanceOf(address(this)) + fixedRateReward) / sDF.totalSupply
```
* ### Stake
User deposits DF and get the wrapped sDF in return, the amount is based on the current `ExchangeRate`.
$$
sDF = \frac {DF} {ExchangeRate}
$$
* ### Unstake
User can also burn their vDF to redeem DF back.
$$
DF = {sDF} \times {ExchangeRate}
$$
Since the `FixedRateReward` is stored in the `RewardVault` contract, there are chances that the remaining `DF` balance is insufficient to payback. In this case, a execution from `RewardVault` will be triggered.