Аудит кода смарт контракта на токен сейл.

1. [КРИТИЧНЫЕ]

— не выявлено

2. [СЕРЬЕЗНЫЕ]

— не выявлено

3. [ПРЕДУПРЕЖДЕНИЯ]

— не выявлено

4. [ЗАМЕЧАНИЯ]

4.1. Классы из библиотеки openzeppelin-solidity не самой последней версии

Изменения в новых версиях:
— незначительные оптимизации библиотеки SafeMath
— изменена проверка баланса пользователя при отправке токенов — теперь при ошибочном указании неправильного баланса не сжигается весь газ транзакции

4.2 Событие Transfer при создании токенов

Согласно стандарту при создании новых токенов следует вызывать метод Transfer с отправителем равным адресу 0x0

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer

> A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created.

4.3. Событие Transfer при сжигании токенов
По аналогии предыдущим пунктом в функции `burn` можно добавить вызов события Transfer с адресом назначения, равным address(0).

В библиотеке openzeppelin-solidity сделано именно так: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/BurnableToken.sol#L43

4.4 Тип decimals
Согласно стандарту тип для `decimals` должен быть uint8: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#decimals

4.5 Запись больших чисел
Для наглядности и уменьшения риска ошибиться большие числа можно записывать так:
1925000000000000000000000000 = 1925000000 * 10**18

Как мы делаем.

Код контракта просматривается вручную на наличие известных уязвимостей, ошибок в логике, соответствие WhitePaper. При необходимости на сомнительные моменты пишутся юнит тесты.