Аудит смарт контракта Smart-234 от BitStat

11 дек 2018 10:18:23 Аудиты смартов

Смарт-контракт Smart-234 встречает нас большим комментарием с подробным описанием своей работы. Помимо описания, присутствует даже наглядный пример вклада в 10 Eth на английском языке.

Останавливаться на данном комментарии мы не будем, так как это выходит за рамки нашего аудита. Нас интересует только рабочий код. Все математически функции расписаны в знакомой нам библиотеке SafeMath.

Ничего нового и зловредного не добавлено. Только основные функции: умножение (mul), деление (div), вычитание (sub) и сложение (add).

Помимо отдельной библиотеки безопасной математики в проекте присутствует отдельный смарт-контракт InvestorsStorage, который отвечает за хранение и взаимодействие с данными. Рассмотрим подробнее все переменные и функции контракта.

Структуры:

Deposit – хранит в себе информацию о депозитах: amount – сумма вклада; start – время совершения инвестиции.

Investor – хранит в себе информацию об инвесторах: deposits – список депозитов; checkpoint – время последней операции инвестора; referrer – адрес реферера.

Закрытые переменные:

owner – адрес владельца контракта InvestorsStorage;

_investorsCount – общее количество инвесторов;

Investors – хранилище (список по адресам) всех инвесторов;

Далее идёт конструктор, который передаёт в переменную owner адрес владельца контракта. Модификатор onlyOwner описывает условие при котором запуск функций будет происходить только от имени владельца контракта. Т.е., никто другой запустить их не сможет.

Функции:

addDeposit – добавляет депозит инвестору: записывает сумму вклада и время вклада, увеличивает общее количество вкладов на 1;

updateCheckpoint – изменяет время вклада любого инвестора;

addReferrer – добавляет реферера инвестору;

Все эти функции внешние и запускаются только «с разрешения» владельца контракта. А позволяют они полностью изменять все данные инвесторов. В связи с этим, необходимо следить за тем, чтобы объект контракта InvestorsStorage создавался только от имени контракта Smart-234. В противном случае, данные инвесторов будут доступны кому-то ещё. Будем внимательно смотреть за этим.

Функция getInterest возвращает процент 2.34 + 0.02 * время депозита в сутки. Более того, в данную функцию можно передать признак того, что что-то пошло не так (_exception). Если _exception == true, то переменная time будет содержать время совершения вклада _index. Иначе, time содержит время последнего обращения инвестора в контракту (checkpoint).

Функция isException передаёт признак того, что есть какая-то ошибка в том случае, когда время депозита _index больше последнего обращения инвестора. Т.е., нельзя совершить вклад из будущего.

Строки 145 – 158 содержат функции для доступа к информации об инвесторах:

d - сумма депозита;

c – время последней операции;

r – адрес реферера;

s – время совершения вклада с номером _index;

sumOfDeposits – общая сумма всех депозитов;

amountOfDeposits – количество депозитов;

dividends – сумма, которую необходимо выплатить инвестору на данный момент по всем вкладам;

Стоит заметить, что при вычислении суммы депозита идёт проверка исключительной ситуации isException о который было сказано выше.

investorsCount – общее количество всех инвесторов;

Основной код смарт-контракта Smart234 начинается со строки 193.

Сперва объявляются переменные контракта.

admin – адрес ethereum-кошелька администрации;

waveStartUp – время старта новой волны проекта (после рестарта);

invested – сумма всех инвестиций в проект;

payed – сумма всех выплат из проекта;

startTime – время старта проекта;

Строки 203-207 содержат в себе описание событий, которые будут вызываться при определённых действиях контракта. Они несут лишь информативную функцию и помогают обновлять статистику на сайте проекта.

x – является ни что иным, как объект контракта InvestorsStorage, который содержит всю информацию об инвесторах.

Модификатор notOnPause проверяет не находится ли проект в паузе. Забегая вперёд, сообщим, что проект умеет рестартовать, после чего прекращает работу на 7 дней. Берёт отпуск. Функция bytesToAddress традиционно конвертирует массив байт из поля Data в понятный для чтения адрес реферера.

Функция addReferrer получает адрес реферера при помощи вышеупомянутой функции bytesToAddress, а затем сравнивает с адресом инвестора. Если адреса не совпадают, то адрес сохраняется в базе инвесторов x. Далее генерируются события для уведомления и функция возвращает 5% от присланной суммы.

Функция refSystem() отвечает за партнёрскую программу. Как и было заявлено в описании, смарт-контракт доходит до 3-его уровня. Рефереру 1 уровня создаётся депозит в размере 10% от суммы, 2 уровня – 5% и 3 уровня – 3%. Имеется ограничение на количество депозитов – 500. Т.е., после того, как количество депозитов превысит 500, партнерская программа для данного кошелька закончится.

Строки 254-259 являются ключевыми. В них находится конструктор, который запускается при создании контракта. Как видно из кода, в него передаётся адрес админа, который скрыт для посторонних глаз и происходит создание базы x, которая хранит в себе информацию обо всём. И как мы помним, изменять информацию может только создатель базы. В данном случае, владельцем является сам контракт Smart234. Получается, что изменять информацию основного хранилища может только контракт и никто другой.

Функция, которая отвечает за обработку транзакций, является одной из самых простых и понятных.

Если контракт получает 0 Eth, то запускается процесс выплаты дивидендов (withdraw()). Иначе запускается процесс инвестирования (invest()). Рассмотрим оба процесса более детально.

Функция Invest() первым делом проверяет поступившую сумму. Если она меньше 0.01 Eth, то инвестировать не удастся. В строке 271 совершается отправка 4% от суммы на нужды администрации. Строки 273 – 278 отвечают за обработку адреса реферера и начисление бонуса. Как уже было сказано выше, функция addReferrer() возвращает 5% от суммы, которые идут бонусом на депозит. В строке 282 к общей сумме всех инвестиций добавляется присланный депозит для статистики.

Функция Withdraw() отвечает за выплату дивидендов инвестору. Переменная _payout содержит сумму, которую необходимо выплатить по всем вкладам на текущий момент. Если размер выплаты превысит баланс контракта, то контракт остановит свою работу и оставшиеся средства останутся замороженными на балансе контракта. В строке 297 идёт обновление временного счётчика. Затем идёт выплата комиссии 4% от суммы _payout. Оставшиеся 96% отправляются инвестору в строке 299. Далее идёт обновление статистики.

Строки 305 – 332 содержат функции, которые помогают получить информацию об инвестициях на вкладке Read Contract.

getDeposits() – выводит общую сумму всех депозитов конкретного инвестора;

getDividents() – выводит сумму, которую необходимо выплатить инвестору на данный момент по всем вкладам;

getDividentsWithFee() – выводит 96% от суммы всех дивидендов;

getDaysAfterStart() – выводит количество дней работы проекта;

investorsCount() – выводит общее количество всех инвесторов;

getInvestedAmount() – выводит общую сумму всех инвестиций в проект;

getPayedAmount() – выводит общую сумму всех выплат из проекта;

Строки 333-339 содержат функцию nextWave(), которая выполняет перезапуск контракта. Идёт создание чистой базы инвесторов, обнуление статистики, переменная waveStartUp получает значение «сегодня + 7 дней» . После этого контракт остановится на 7 дней, так как условие notOnPause перестанет выполняться и основные функции контракта не будут запускаться.

Аудит исходного кода контракта Smart-234 показал, что владелец контракта не имеет доступа ко всей «кассе». Все заявленные цифры по процентам соответствуют действительности. Остановить, изменить контракт или повлиять на бизнес-логику также нет возможности. Дыр и бекдоров нет. Все чисто, подходит для инвестиций.

Огромным плюсом является то, что существует предыдущая версия контракта под названием Smart-Pyramid, который работает и плавно развивается не один месяц.

Приходите на обсуждение проектов в наш чат: https://t.me/joinchat/C1ie2RK-ocDXAyuh2f00rA.

Предупреждение

Не рассматривайте этот текст как финансовый совет. Наша команда - не инвестиционные консультанты, мы просто делимся своим личным мнением. Прежде чем инвестировать, пожалуйста, проведите собственный технический и рыночный анализ.
Все материалы сайта носят исключительно информационный характер и не могут быть расценены как призыв к действию. Вкладывая свои деньги, Вы можете ничего не заработать или потерять всё. Ответственность за принятие решений лежит только на Вас.

Хотите зарабатывать на крипте? Подписывайтесь на наши Telegram каналы!

0 комментов2 391 просмотр
Читайте также
Комментарии
Только зарегистрированные пользователи могут писать комментарии.
Авторизуйтесь, пожалуйста, или зарегистрируйтесь.
Новые проекты
Вклады в проекты
Вклады в смарты
Рейтинг смартов
Подписывайтесь