# Hardcore
## 1. Введение
Данный токенсейл имеет ряд специфических деталей, отличающих его от обычных токенсейлов.
1. На сид раунде пользователи меняют временный токен на токен HRC.
2. Пользователи сида приглашают пользователей приват по реферальным ссылкам, не имея которых зарегистрироватся на приват **нельзя**.
3. 5-ти уровневая партнерская программа.
Эти обстоятельства привели к использованию 2-х **изолированных друг от друга** реестров пользователей с отличными друг от друга идентификаторами пользователей:
1. Контракт токенсейла в БЧ
1. Сервис партнерской программы - фиксирует все покупки в контракте и авторизирует выплаты по партнерской программе.
## 2. Сервер партнерской программы
Для удешевления разработки сервер партнерской программы не имеет возможности наблюдать за транзакциями в контракте токенсейла, из-за этого для достижения [ACID](https://en.wikipedia.org/wiki/ACID) используется [алгоритм двухфазного коммита](https://neerc.ifmo.ru/wiki/index.php?title=2_Phase_Commit), координатором в котором выступает пользователь.
## 3. Алгоритм двух-фазного коммита
> приватного токенсейла
Контракт токенсейла имеет две функции, использование которых авторизуется двумя ЦП(пользовательской и подписью сервера партнерской программы).
1. Для фиксации суммы покупки на сервере партнерской программы от сервера партнерской программы требуется сформировать мета-транзацию и подписать ее, тем самым при покупке мета-транзакция выступает в роли 2FA(те доказательством фиксации суммы покупки в сервисе партнерской программы).
```solidity=
// тело мета-транзакции (_userId, _sequence)
function swap(
bytes32 hashedMessage, // дайджест мета-транзакции
string memory _userId, // идентификатор пользователя на сервере партнерской программы
uint256 _sequence, // порядковый номер мета-транзакции(nonce)
uint8 _v, // v,r,s = цифровая подпись мета-транзакции
bytes32 _r,
bytes32 _s,
uint256 _value
)
```
2. Для получения партнерских вознаграждений функция клейма(выплат) партнерских вознаграждений использует метатранзакцию, подписанную сервером партнерской программы, выступающим 2FA(тк сервис партнерской программы является единственным доверенным хранилещем сумм партнерских вознаграждений).
```solidity=
// тело мета-транзакции (msg.sender, _sequence, amount),
// msg.sender = адрес кошелька пользователя
function claimReferal(
bytes32 hashedMessage, // дайджест мета-транзакции
uint256 amount, // сумма реферальных бонусов
uint256 sequence, // порядковый номер мета-транзакции(nonce)
uint8 _v, // v,r,s = цифровая подпись мета-транзакции
bytes32 _r,
bytes32 _s,
address from
)
```