# REG
Стек: C/C++, eosio.cdt 1.5.0

# Введение
Поскольку каждый новый аккаунт системы должен получить ресурсы RAM, CPU и NET, а количество ресурсов в системе ограничено, то все регистрации являются платными и за них кто-то должен заплатить в системном токене. Регистратор обеспечивает работу FREEMIUM бизнес-модели, при которой, пользователь получает возможность ограниченного использования любого продукта системы до истечения срока давности пользования своим гостевым аккаунтом. Регистратором нового аккаунта может выступить любой аккаунт системы и получить комиссию за это. 

# Компиляция
Заменить ABSOLUTE_PATH_TO_CONTRACT на абсолютный путь к директории контракта reg. 
```
docker run --rm --name eosio.cdt_v1.5.0 --volume /ABSOLUTE_PATH_TO_CONTRACT:/project -w /project eostudio/eosio.cdt:v1.5.0 /bin/bash -c "eosio-cpp -abigen -I include -R include -contract reg -o reg.wasm registrator.cpp" & 

```

# Установка
```
cleos set contract registrator ABSOLUTE_PATH_TO_CONTRACT -p registrator
```

# Генерация документации
Требуется Doxygen версии от 1.9.3
```
git submodule update --init --recursive
doxygen
```

# Действующие аккаунты
- me - собственное имя аккаунта контракта
- partners - имя аккаунта контракта хранилища партнёров
- core - имя аккаунта цифровой экономики ядра
- system_account - имя аккаунта системного контракта    

# Основные управляющие параметры
- GUEST_EXPIRATION - продолжительность гостевого периода, после которого, аккаунт может быть отозван
- SYMBOL - системный токен
- ramcore_symbol - идентификационный токен рынка оперативной памяти
- RAM_symbol - токен рынка оперативной памяти
- MIN_AMOUNT - комиссия, взымаемая регистратором за пользование гостевым аккаунтом
- BASKET - количество гостевых аккаунтов, которые могут быть отозваны за один вызов действия
    

# Роли
- Пользователь. Гость или партнёр, чей аккаунт регистрируется. 
- Регистратор. Тот, кто регистрирует аккаунт и оплачивает ресурсы аккаунта. 

# Пополнение баланса
Для совершения действий регистрации аккаунта, необходимо обладать системным токеном на своём балансе в регистраторе. Для пополнения баланса, необходимо отправить перевод на аккаунт контракта в системном токене с указанием регистратора в поле memo: 
```
cleos transfer your_account registrator "100.0000 FLOWER" "registrator"
```
После чего можем получить баланс регистратора из таблицы:
```
cleos get table registrator registrator balance
```
В ответе будет баланс:
```
"rows": [{
      "username": "registrator",
      "quantity": "100.0000 FLOWER"
    }
  ],
```

# Регистрация гостя
Для регистрации аккаунта в качестве гостя, необходимо вызвать метод regaccount, передав параметр is_guest = true: 
```
cleos push action registrator regaccount '[registrator, "", tester, EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV, "1.0000 FLOWER", "1.0000 FLOWER", 16384, true, false]' -p registrator
```
Тогда, получив аккаунт tester, мы увидим, что права владельца находятся у регистратора:
```
permissions: 
     owner     1:    1 registrator@eosio.code, 
        active     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory: 
     quota:        16 KiB    used:     2.908 KiB  

net bandwidth: 
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 bytes
     available:        3.169 TiB  
     limit:            3.169 TiB  

cpu bandwidth:
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 us   
     available:        92.31 hr   
     limit:            92.31 hr   
```
Для оплаты регистрации, гость должен пополнить свой баланс и вызвать метод payforguest:
```
cleos push action registrator payguest '[registrator, tester, "3.2786 FLOWER"]' -p registrator
```
Сумма к оплате может быть получена в таблице guests. Она расчитывается исходя из стоимости оперативной памяти в момент регистрации и количества системного токена, закладываемого в CPU и NET. 

После оплаты, мы можем убедиться, что права владельца аккаунта находятся у владельца ключа:
```
permissions: 
     owner     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
        active     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory: 
     quota:        16 KiB    used:     2.926 KiB  

net bandwidth: 
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:                97 bytes
     available:        3.109 TiB  
     limit:            3.109 TiB  

cpu bandwidth:
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:             23.16 ms   
     available:        90.57 hr   
     limit:            90.57 hr   


```

# Регистрация партнёра
Для регистрации аккаунта в качестве гостя, необходимо вызвать метод regaccount, передав параметр is_guest = false: 
```
cleos push action registrator regaccount '[registrator, "", tester2, EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV, "1.0000 FLOWER", "1.0000 FLOWER", 16384, true, false]' -p registrator
```

Тогда, получив аккаунт tester2, мы увидим, что права владельца находятся у владельца ключа:
```
permissions: 
     owner     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
        active     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory: 
     quota:        16 KiB    used:     3.365 KiB  

net bandwidth: 
     staked:       1.0000 FLOWER           (total stake delegated from account to self)
     delegated:    0.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 bytes
     available:        3.109 TiB  
     limit:            3.109 TiB  

cpu bandwidth:
     staked:       1.0000 FLOWER           (total stake delegated from account to self)
     delegated:    0.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 us   
     available:        90.57 hr   
     limit:            90.57 hr    
```

# Отзыв аккаунта гостя
Для того, чтобы отозвать аккаунт у гостя, необходимо вызвать метод update. Метод получает таблицу guests с сортировкой по ключу expiration_at, и заменяет активные ключи аккаунтов на себя. Количество аккаунтов к отзыву за один вызов метода update регулируется константой BASKET. Вызов метода может осуществить любой аккаунт сети. 
```
cleos push action registrator update '[]' -p registrator
```
Получив объект аккаунта истекшего гостя, увидим, что активные права доступа теперь принадлежат регистратору: 
```
permissions: 
     owner     1:    1 registrator@eosio.code, 
        active     1:    1 registrator@eosio.code, 
memory: 
     quota:        16 KiB    used:     2.891 KiB  

net bandwidth: 
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 bytes
     available:        3.109 TiB  
     limit:            3.109 TiB  

cpu bandwidth:
     delegated:    1.0000 FLOWER           (total staked delegated to account from others)
     used:                 0 us   
     available:        90.57 hr   
     limit:            90.57 hr 
```
Все отозванные аккаунты хрянятся в таблице reserved: 
```
cleos get table registrator registrator reserved
```
В ответе список отозванных аккаунтов с указанием регистраторов:
```
"rows": [{
      "username": "eyfyjkpbctwv",
      "registrator": "registrator"
    },{
      "username": "hgrmogbyerml",
      "registrator": "registrator"
    },{
      "username": "yotlnhctihdg",
      "registrator": "registrator"
    }
  ]
```


### Документация к методам и таблицам контракта
Документация к методам и таблицам контракта доступна в папке docs/html/index.html


# TODO
- Рассмотреть возможность внедрения бизнес-модель доходного пула ликвидности для аккаунтов, обеспечивающих регистрацию гостей. Сейчас каждый регистратор обеспечивает оплату стоимости аккаунта собственными средствами. Предоставить возможность собирать средства на оплату новых регистраций из числа средств партнёров. 
- Внедрить систему оценки и выдачу коротких имён.
- Убрать LEGACY связь с контрактом core в методе payforguest.
