# New APR reward system.
## For all Lend, Borrow, and LP
$$ \text{reward_APR} = \frac{\text{reward_per_second}(\text{year})}{\text{total_principal_amount_converted_to_dollars}}$$
## Accounting Logic
- Have user positions dict
- This dict has the follwing structure - `key (user) value (list (tuple (tokenAmount, positionAmount, timestamp)))`
- When a user opens a position ordered by timetamp, logIndex:
- Check user_positions has the user or not,
- If yes: append the position as follows to the list (tuple (tokenAmount, positionAmount, timestamp))
- Else: Create a list with the with a single entity [(tuple (tokenAmount, positionAmount, timestamp))]
- When a user closes a position ordered by timestamp, logIndex:
- Get the list from the user positions dict
- For the given position amount that is being closed, keep closing each tuple as follows:
- If the close position amount is x, and the current position amount is y
- if x> y, delete the current action tuple and continue
- if x=y, delete the currrent action tuple
- if x < y, update current action tuple as y-x
## Reward distribution logic
- Initialize a dict user_rewards with the following structure `key (user) value (reward amount)`
- Loop across timestamps from start/end timestamp
- Get current user action from the user_positions dict
- Get the reward for the given timestamp - let this be r
- Get the sum of all token amounts across all users in the dict - let this be U
- Get the sum of all token amounts for the given user - let this be u
- That implies the reward for user for the given timestamp is u*r/U
- Update user_rewards as follows: user_rewards[user] = user_rewards.get(user,0) + u*r/U