# Reward APR Calculation Logic
## Transactional Calculation
### Lend
1. Reward per second short:
$$ \text{Reward per second}_{\text{short}} = \frac{\text{reward per second in \$}}{\text{total short at that given time}} $$
2. Updated reward per second short:
$$ \text{Updated Reward per second}_{\text{short}} = \frac{\text{reward per second in \$}}{\text{total short at that given time} + \text{expected short}} $$
3. Reward APR:
$$ \text{reward apr}_{\text{short}} = \frac{\text{Updated Reward per second}_{\text{short}} \times \text{short} \times 31556926}{\text{total token amount user is lending in \$}} $$
### Borrow
#### Case Long 0
1. Reward per second long 0:
$$ \text{Reward per second}_{\text{long}0} = \frac{\text{reward per second in \$}}{\text{total long 0 at that given time}} $$
2. Updated reward per second long 0:
$$ \text{Updated Reward per second}_{\text{long}0} = \frac{\text{reward per second in \$}}{\text{total long 0 at that given time} + \text{expected long 0}} $$
3. Reward APR:
$$ \text{reward apr}_{\text{long}0} = \frac{\text{Updated Reward per second}_{\text{long}0} \times \text{expected long}0 \times 31556926}{\text{total token amount user is borrowing in \$}} $$
#### Case Long 1
1. Reward per second long 1:
$$ \text{Reward per second}_{\text{long}1} = \frac{\text{reward per second in \$}}{\text{total long 1 at that given time}} $$
2. Updated reward per second long 1:
$$ \text{Updated Reward per second}_{\text{expected long}1} = \frac{\text{reward per second in \$}}{\text{total long 1 at that given time} + \text{expected long 1}} $$
3. Reward APR:
$$ \text{reward apr}_{\text{long}1} = \frac{\text{Updated Reward per second}_{\text{long}1} \times \text{long}1 \times 31556926}{\text{total token amount user is borrowing in \$}} $$
### Liquidity
1. Reward per second liquidity:
$$ \text{Reward per second}_{\text{liquidity}} = \frac{\text{reward per second in \$}}{\text{total liquidity at that given time}} $$
2. Updated reward per second liquidity:
$$ \text{Updated Reward per second}_{\text{liquidity}} = \frac{\text{reward per second in \$}}{\text{total liquidity at that given time} + \text{expected liquidity}} $$
3. Reward APR:
$$ \text{reward apr}_{\text{liquidity}} = \frac{\text{Updated Reward per second}_{\text{liquidity}} \times \text{expected liquidity amount} \times 31556926}{\text{total token amount user is providing as liquidity in \$}} $$
Comments
total_reward_amount * remaining_duration / (duration * (duration + 1) / 2)
$$ \text{total_reward_amount} = \frac{(\text{duration})(\text{largest_reward_per_second})}{2} $$
$$ \frac{\text{largest_reward_per_second}}{\text{duration}} = \frac{\text{reward_per_second}}{\text{remaining_duration}} $$
$$ \text{total_reward_amount} = \frac{(\text{duration})(\text{reward_per_second})(\text{duration})}{2(\text{remaining_duration})} $$
$$ \text{reward_per_second}=\frac{2(\text{total_reward_amount})(\text{remaining_duration})}{(\text{duration})^2} $$
# MARGINAL REWARD APR
# Lending
$$ \text{solidity_sqrt_interest_rate} = \sqrt{\frac{z}{x+y}} $$
$$ \text{reward_per_second_short} = \frac{\text{reward_per_second}}{\text{short_in_reward}} $$
## Case 1 $\text{solidity_strike} >= 2^{128}$
### Case 1.1 User lends x' token0 (disregard when reward parameter isToken0 is false)
token0 $x'=x$
short per token0 $\frac{x+zd}{x}$
$$ \frac{zd}{x} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_short})(\text{short_per_token0})(\text{year})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{short_in_reward}})(\frac{x+zd}{x})(\text{year})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{year})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{short_in_reward})(2^{288})} $$
### Case 1.2 User lends y' token1 (disregard when reward parameter isToken0 is true)
token1 $\frac{y'(2^{128})}{\text{solidity_strike}}=y$
short per token1 $\frac{y+zd}{y'}=\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})}$
$$ \frac{zd}{y} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_short})(\text{short_per_token1})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{short_in_reward}})(\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{short_in_reward})(\text{solidity_strike})(2^{160})}$$
## Case 2 $\text{solidity_strike} < 2^{128}$
### Case 2.1 User lends x' token0 (disregard when reward parameter isToken0 is false)
token0 $\frac{x'(\text{solidity_strike})}{2^{128}}=x$
short per token0 $\frac{x+zd}{x'}=\frac{(x+zd)(\text{solidity_strike})}{x(2^{128})}$
$$ \frac{zd}{x} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_short})(\text{short_per_token0})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{solidity_strike})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{short_in_reward})(2^{416})}$$
### Case 2.2 User lends y' token1 (disregard when reward parameter isToken0 is true)
token1 $y'=y$
short per token1 $\frac{y+zd}{y}$
$$ \frac{zd}{y} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_short})(\text{short_per_token1})(\text{year})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{short_in_reward}})(\frac{y+zd}{y})(\text{year})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{year})}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{short_in_reward})(2^{288})}$$
### Reverse
$$ \text{short_in_reward} = \frac{(\text{reward_per_second})(1+d(\text{sqrt_interest_rate})^2)(\text{year})}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{reward_apr})(2^{288})}$$
# Borrowing
$$ \text{solidity_sqrt_interest_rate} = \sqrt{\frac{z}{x+y}} $$
if isLong0 is true
$$ \text{reward_per_second_long0} = \frac{\text{reward_per_second}}{\text{long0}} $$
if isLong0 is false
$$ \text{reward_per_second_long1} = \frac{\text{reward_per_second}}{\text{long1}} $$
when reward parameter isToken0 is true, then isLong0 is false.
when reward parameter isToken0 is false, then isLong0 is true.
## Case 1 $\text{solidity_strike} >= 2^{128}$
### Case 1.1 isToken0 is true and isLong0 is false. Borrower borrows x' token0 (Disregard if reward parameter isToken0 is false)
token0 $x'=x$
long1 per token0 $\frac{(x+zd)(\text{solidity_strike})}{x(2^{128})}$
$$ \frac{zd}{x} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_long1})(\text{long1_per_token0})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{long1_in_reward}})(\frac{(x+zd)(\text{solidity_strike})}{x(2^{128})})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{solidity_strike})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{long1_in_reward})(2^{416})} $$
### Case 1.2 isToken0 is false and isLong0 is true. Borrower borrows y' token1 (Disregard if reward parameter isToken0 is true)
token1 $\frac{y'(2^{128})}{\text{solidity_strike}}=y$
long0 per token1 $\frac{(y+zd)}{y'}=\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})}$
$$ \frac{zd}{y} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_long0})(\text{long0_per_token1})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{long0_in_reward}})(\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{long0_in_reward})(\text{solidity_strike})(2^{160})}$$
## Case 2 $\text{solidity_strike} < 2^{128}$
### Case 2.1 isToken0 is true and isLong0 is false. Borrower borrows x' token0 (Disregard if reward parameter isToken0 is false)
token0 $\frac{x'(\text{solidity_strike})}{2^{128}}=x$
long1 per token0 $\frac{(x+zd)}{x'}=\frac{(x+zd)(\text{solidity_strike})}{x(2^{128})}$
$$ \frac{zd}{x} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_long1})(\text{long1_per_token0})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{solidity_strike})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{long1_in_reward})(2^{416})}$$
### Case 2.2 isToken0 is false and isLong0 is true. Borrower borrows y' token1 (Disregard if reward parameter isToken0 is true)
token1 $y'=y$ (token1)
long1 per token1 = $\frac{y+zd}{y}$ (long1/token1)
long0 per token1 $\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})}$ (long0/token1)
$$ \frac{zd}{y} = \frac{d(\text{sqrt_interest_rate})^2}{2^{288}}$$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_long0})(\text{long0_per_token1})(\text{year})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{long0_in_reward}})(\frac{(y+zd)(2^{128})}{y(\text{solidity_strike})})(\text{year})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(2^{288}+d(\text{sqrt_interest_rate})^2)(\text{year})}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{long0_in_reward})(\text{solidity_strike})(2^{160})}$$
y=100 USDC
zd = 10 USDC
y+zd = 110 USDC
(y+zd) / y = 1.1
0.6 USDC/ARB
1.833 ARB/USDC long0 per token1
spot price $ / USDC
reward per second long0 $ / (second * ARB)
year second
($ / (second * ARB))*(ARB/USDC)*second*(USDC/$)
## Assumptions
- Base all calculations on debt and not principals
- Lenders looked okay even though we used the short position
- Borrow reward apr is off by the cdp factor
borrow $\Delta y$
long0 received is $\frac{(\Delta y+d\Delta z)(2^{128})}{\text{solidity_strike}}$
$$\text{new_reward_per_second_long0} = \frac{\text{reward_per_second}(year)}{\text{long0_in_reward} + \frac{(\Delta y+d\Delta z)(2^{128})}{\text{solidity_strike}}} $$
$$ \text{transaction_reward_APR} = \frac{\text{new_reward_per_second_long0}(\frac{(\Delta y+d\Delta z)(2^{128})}{\text{solidity_strike}})(year)}{\Delta y} $$
# Add Liquidity
## Case 1 $\text{solidity_strike}>=2^{128}$
$$ \text{solidity_sqrt_interest_rate} = \sqrt{\frac{z}{x+y}} $$
$$ \text{solidity_liquidity} = L = \sqrt{(z)(x+y)} $$
### Case 1.1 LP adds token0 (disregard if reward parameter isToken0 is false)
token0 $x'=x$
liquidity per token0 $\frac{L}{x}$
$$ \frac{L}{x}=\frac{\text{solidity_sqrt_interest_rate}}{2^{96}} $$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_liquidity})(\text{liquidity_per_token0})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{liquidity_in_reward}})(\frac{L}{x})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(\text{sqrt_interest_rate})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{liquidity_in_reward})(2^{96})} $$
### Case 1.2 LP adds token1 (disregard if reward parameter isToken0 is true)
token1 $\frac{y'(2^{128})}{\text{solidity_strike}}=y$
liquidity per token1 $\frac{L}{y'}=\frac{L(2^{128})}{y(\text{solidity_strike})}$
$$ \frac{L}{y}=\frac{\text{solidity_sqrt_interest_rate}}{2^{96}} $$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_liquidity})(\text{liquidity_per_token1})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\frac{\text{reward_per_second}}{\text{liquidity_in_reward}})(\frac{L(2^{128})}{y(\text{solidity_strike})})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(\text{sqrt_interest_rate})(2^{32})}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{liquidity_in_reward})(\text{solidity_strike})} $$
## Case 2 $\text{solidity_strike} < 2^{128}$
### Case 2.1 LP adds token0 (disregard if reward parameter isToken0 is false)
token0 $\frac{x'(\text{solidity_strike})}{2^{128}}=x$
liquidity per token0 $\frac{L}{x'}=\frac{L(\text{solidity_strike})}{x(2^{128})}$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_liquidity})(\text{liquidity_per_token0})}{\text{token0_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(\text{sqrt_interest_rate})(\text{solidity_strike})}{(\text{token0_dollar_spot_price_per_smallest_unit})(\text{liquidity_in_reward})(2^{224})} $$
### Case 2.2 LP adds token1 (disregard if reward parameter isToken0 is true)
token1 $y'=y$
liquidity per token1 $\frac{L}{y}$
$$ \text{reward_apr}= \frac{(\text{reward_per_second_liquidity})(\text{liquidity_per_token1})(\text{year})}{\text{token1_dollar_spot_price_per_smallest_unit}}$$
$$ \text{reward_apr} = \frac{(\text{reward_per_second})(\text{sqrt_interest_rate})(\text{year})}{(\text{token1_dollar_spot_price_per_smallest_unit})(\text{liquidity_in_reward})(2^{96})} $$
# Alternative
## Lend
Given Short tokens to token0 return
$$ \text{token0_return} = \frac{short}{K \geq 1 ? 1 : K} $$
$$ \text{reward_APR} = \text{reward_per_second_short} \times \text{year} \times \frac{short}{\text{token0_return}(\text{token0_spot})}$$
$$ \text{reward_APR} = \frac{\text{reward_per_second_short} \times \text{year} \times (K \geq 1 ? 1 : K)}{\text{token0_spot}}$$
Given Short tokens to token1 return
$$ \text{token1_return} = \text{short} \times (K \geq 1 ? K : 1)$$
$$ \text{reward_APR} = \text{reward_per_second_short} \times \text{year} \times \frac{short}{\text{token1_return}(\text{token1_spot})}$$
$$ \text{reward_APR} = \frac{\text{reward_per_second_short} \times \text{year}}{(K \geq 1 ? 1 : K)(\text{token1_spot})}$$
## Borrow
Given Long1 to token0
$$\text{token0_debt}= \frac{\text{long1}}{K}$$
$$ \text{reward_APR} = \text{reward_per_second_long1} \times \text{year} \times \frac{long1}{\text{token0_debt}(\text{token0_spot})} $$
$$ \text{reward_APR} = \frac{\text{reward_per_second_long1} \times \text{year} \times K}{\text{token0_spot}}$$
Given Long0 to token1
$$\text{token1_debt} = \text{long0} \times K$$
$$ \text{reward_APR} = \text{reward_per_second_long0} \times \text{year} \times \frac{long0}{\text{token1_debt}(\text{token1_spot})}$$
$$ \text{reward_APR} = \frac{\text{reward_per_second_long0} \times \text{year}}{\text{token0_spot}(K)}$$
Illustrative example
- Reward per year is 100 USD
- Alice borrows 500 USD has a position 500 Long ARB
- Bob borrows 500 USD has a position of 1000 Long ARB
- Alice will get 25 USD per year => APR of 5%
- Bob will get 75 USD per year => APR of 15%
- Assuming interest of 10%
- From the formula above we get the Marginal APR to be 9.1%