Введение

Loop - Сервис в котором с помощью смарт-контрактов сети Tron пользователи получают вознаграждение в соответствующих криптовалютах за расширение своей команды и увеличение числа участников LOOOOP.

Задача - Провести аудит смарт-контракта по следующим параметрам:

Общие замечания

  1. Версия компилятора 0.5.10, хотя текущая версия 0.8.13. Даже если есть какая то фантастическая причина не использовать более свежую версию, я бы рекомендовал хотя бы использовать последнюю версию текущей ветки т.к они содержат кучу багфиксов (и это ссылка не на последнюю минорную версию ветки 0.5.x). Сами разработчики эфириума рекомендуют всегда использовать последнии версии. Например в версии 0.8.0 включен безопасный режим вычислений по умолчанию, т.е код упадет в случае какой то ошибки в вычислениях, а не просто выдаст непредсказуемое значение. Я внес небольшие правки в контракт и он вполне компилируется с версией 0.8.13

    Список релизов

  2. Я бы советовал использовать UUPS Proxy для возможности обновить код контракта не потеряв состояние. Пригодится на случай обнаружения критичных багов в процессе или необходимости добавить какой то функционал. Прокси позволит задеплоить новый контракт, но сохранить старое состояние (данные юзеров и т.д)

  3. SafeMath.sol - Нафига он тут? Вот что разработчик этой библиотеки нам завещал: NOTE: SafeMath is no longer needed starting with Solidity 0.8. The compiler now has built in overflow checking. Проще говоря, если обновить версию компилятора, то этот файл станет просто не нужным, а код более очевидным. Кроме того у меня есть подозрение что версия 0.5.10 компилятора выбрана только чтобы обеспечить работу этой либы. Т.е разработчик решил использовать либу, она не запускалась на свежей версии солидити, он понизил версию солидити. А либа просто не нужна и решение куда проще - удалить код. Разработчики часто попадают в такую ловушку.

  4. Местами валяется какой-то мусор. Ни на что не влияет, просто небрежно

    1. LoopCommunityContractInterface - Пустой интерфейс, не используется нигде
    2. DataSeederContract.sol - Контракт который не используется, к тому же содержит пустой метод registerUsers с пометкой /// @dev TODO: DELETE IT IN PRODUCTION. Интерфейс выше из этого же файла. Тут либо в процессе работы и рефакторинга остался мусор, либо разраб просто решил каких то филлеров накидать чтобы проект казался больше (вряд-ли, слишком очевидно)
    3. Migrations.sol - Стандартный файл для truffle проекта, проблема в том что миграция которая использует этот артефакт закоменчена, т.е это просто мусор. Ни на что не влияет, пусть лежит на всякий случай, видимо такая логика.
  5. BytesConvertor.sol так и просится быть Library. Разница небольшая, просто код будет чище и уменьшится наследование.

  6. Ownable.sol - Стандартная библиотека openzeppelin, я предпочитаю такие штуки импортировать из npm и не захламлять проекты. Но вообще ничего страшного, особенно если учесть что это единственный такой файл

  7. Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: <SPDX-License>" to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see <https://spdx.org> for more information. В начале каждого солидити файла должен быть такой комментарий, иначе ругается. Ворнинг не смертельный, но неприятно что он вообще есть.

Контракты

Перечислю только важные контракты, т.к остальное либо сторонний код, либо просто хелперы

TreasuryContract - Казначей

Данный контракт создан для распределения средств по владельцам. На данный контракт можно отправить средства, а затем вызвать метод sendPayments, который распределит эти деньги по адресам прописанным в контракте, в зависимости от доли каждого.