# Staking

### User Flow
1. Пользователь депонирует казино-койн ($CAS) и получает LP токен в соотношении 1:1. Этот LP токен будет использоваться только для вывода средств.
2. После стейкинга пользователь может использовать LP токен для игры в казино:
- **2.a:** Если пользователь ставит 10 LP токенов и выигрывает, ему перечисляется награда в $CAS (или в другой валюте, например, USDT/BTC). При этом ставка в LP токенах позволяет играть на эквивалент в $CAS, и выигрыш перечисляется напрямую на кошелек пользователя, а не в стейкинг.
- **2.b:** Если пользователь ставит 10 LP токенов и проигрывает, эти токены перечисляются на адрес казино. Казино может вывести их из стейкинга.
3. После окончания периода блокировки стейкинга пользователь может обменять LP токены обратно на $CAS. В этот момент $CAS возвращается из стейкинга пользователю, и соответствующее количество LP токенов сжигается.
### Распределение Наград за Стейкинг
Награды за стейкинг перечисляются напрямую на кошельки пользователей, а не в сам стейкинг. Например, если пользователь депонировал 10 $CAS и через неделю ему полагается награда в 1 $CAS (или 1 USDT), эта сумма будет перечислена ему на кошелек.
### Расчет Награды
Сумма, которую нужно перевести каждому пользователю, рассчитывается путем умножения количества LP токенов на время стейкинга, создавая "взвешенный вклад" каждого пользователя. Затем используется этот взвешенный вклад для определения доли каждого пользователя в общей награде.
#### Взвешенный Вклад Пользователя:
```
weighted_contribution_user = LP_tokens_user * staking_time_user
```
#### Общий Взвешенный Вклад:
```
total_weighted_contribution = Σ (LP_tokens_user * staking_time_user)
```
#### Доля Награды Пользователя:
```
reward_share_user = weighted_contribution_user / total_weighted_contribution
```
#### Сумма Награды:
```
user_reward = reward_share_user * total_reward
```
### Отслеживание Времени
Данные по времени будут получены, когда пользователь депонирует средства в стейкинг и получает LP токен. Бекенд получит событие (event) с `timestamp` депозита. При выплате награды можно будет рассчитать, как долго средства находились на депозите. После выплаты награды расчет начнется снова, и если назвать промежутки между выплатами "эпохами", мы будем рассчитывать продолжительность депозита для каждой эпохи.
### Отслеживание Владения LP Токенами
В такой архитектуре нам нужно награждать пользователей, которые в данный момент владеют LP токенами. Необходимо отслеживать все адреса с LP токенами и их количество. Если пользователь переводит LP токены с одного кошелька на другой, мы должны отследить это, чтобы корректно начислить награду за стейкинг на новый кошелек. Для этого можно использовать бота, который будет "слушать" tonscan (все транзакции в TON), и если будет транзакция с нашим LP токеном, отслеживать ее. Таким образом, мы всегда будем иметь актуальную базу данных, кто владеет токенами, сколько у него токенов и когда они были задепонированы в стейкинг.
### Итог
На мой взгляд, такая архитектура предлагает идеальное сочетание прозрачности и удобства реализации. Суть стейкинга заключается в блокировке средств пользователя, не более. С административной стороны не будет возможности ни депонировать средства в систему стейкинга, ни выводить их оттуда. Однако благодаря LP токену, пользователи смогут гемблить, используя заблокированные средства, что обеспечивает дополнительную гибкость. Кроме того, LP токен обеспечивает прозрачную систему вывода средств и расчёта наград.