В статье приведен аудит ICO проекта gamb.io. Проанализированы сборы, работа смарт-контракта и транзакции в блокчейне. Рассмотрены только технические стороны процесса. Аудит проведен аналитиками и программистами CryptoB2B 25 июля 2018. К сожалению, найдено много признаков мошенничества. Более того, оно сделано на очень примитивном уровне, программистами с крайне низким опытом, что вызывает отдельное порицание. Если кратко, все сборы — ложь, а прямо во время написания аудита из воздуха был нарисован +1 млн долларов сборов и hardcap внезапно изменился с 30 до 15 млн. К сожалению, эта компания собрала $74000 реальных денег в блокчейне с доверчевых инвесторов. Общий итог технического аудита: 0 из 10, экстремально плохо.
Что-то странное…
Слева скриншот от 25.07.2018 00:00. Справа — спустя 10 часов. Всего за ночь они изменили Hardcap (30 -> 15) и дорисовали +1 млн долларов. За эти 10 часов в блокчейне была всего 1 денежная транзакция на 2,9 ETH. Так же было «Presale ends», стало «bonus ends».
Выводы делайте сами…
Эти 2.9 ETH равны 1,1 миллиону долларов.
10 часов назад реальные сборы были $74,000 (откуда это взялось — глава ниже), а на сайте $11,5M.
Сегодня утром сборы равны $75,646.22, а на сайте уже $12,8M.
Если поделить 11,5M на 74K и 12,8M на 75,6K, то выведем новый показатель. Коэффициент вранья GAMB ~= 169. Именно во столько раз они соврали со сборами. Попробуйте ради смеха отправить им 0,01 ETH ($5). Тогда их общий сбор увеличится на +$760.
Сумма сбора в $11,5M — ложь
Проект утверждает, что собрал ~30% hardcap или $11,5M. Эти деньги не удалось обнаружить.
Смарт контракт GAMB для сбора денег в ETH (других валют в их кабинете не нашлось) расположен по адресу:
- Crowdsale — https://etherscan.io/address/0x66323324b77d72c65ea76caa918464836498ebd6#readContract
- Token — https://etherscan.io/address/0xa0008f510fe9ee696e7e320c9e5cbf61e27791ee#readContract
- Бенефициар — https://etherscan.io/address/0x01e0c66def9faca90b2664378dd8aa9755b31270#readContract
Проверим по контракту Crowdsale или по кошельку Бенефициара (переменная wallet в Crowdsale) сколько прошло денег через них, для этого с адреса Crowdsale кликайте на вкладку «Read Contract», далее на wallet:
В открывшем окне показана текущая сумма сбора:
Как видите, там собрано ~$74 000. А на сайте написано $11 500 000. Возможно, с этого счета выводились деньги? Нет, это легко проверить, скачав все 83 транзакции от инвесторов но этому адресу: https://etherscan.io/txsinternal?ps=100&zero=false&a=0x01e0c66def9faca90b2664378dd8aa9755b31270&valid=all
Итого:
- Компания GAMB проводит ICO и заявляет, что сборы идут через смарт контракт
- Сборы осуществляются только в ETH (не удалось найти другой информации)
- Адрес смарт контракта скрыт, не публикуется, потребовалось искать самостоятельно
- Публично на словах собрано $11,5M
- По факту подтверждено только $74K
Почему так? Мы не знаем. Возможны следующие сценарии:
- Это мошенники, намеренно обманывающие инвесторов. Судя по скромной сумме в $74K — не получилось.
- Они принимают деньги не только в ETH, например в чемодане, безналичным переводом, в Биткоинах (эти способы не объявлены). Возможно, они собрали на закрытом presale $11,5M. Судя по сайту, это не афишируется. Там крупно написано, что сборы идут в ETH и что собрано $11,5M, что неверно.
- 0x66323324b77d72c65ea76caa918464836498ebd6 — не их смарт контракт, а есть еще какой-то… Мы тщательно проверили эту версию. Вероятность ошибок мала. Данный контракт имеет очень много признаков, что это их код: активные сборы, копирование Whitelist, совпадают суммы Hardcap, приличные деньги на функционирование смарт-контракта (такие дорогие тесты никто бы не сделал).
Бессмысленная растрата денег
Это не уязвимость, но расточительная глупость архитектуры смарт контракта (из-за KYC проблем, что описаны ниже). Все числа действительны на 24 июля, на момент, когда их сборы были якобы $11,5М.
https://etherscan.io/address/0xe2a0e69b0f21f1afcd5ab93ecd892fbf0f2ed2e1
Это кошелек программиста GAMB, с которого управляют смарт контрактом. Когда очередной клиент проходит регистрацию в Личном Кабинете и успешно проходит KYC, программист сообщает в смарт контракт новый ETH кошелек. Обратите внимание — инвестор только зарегистрировался, еще ничего не заплатил (и не должен), но программист (за счет GAMB) уже потратил деньги, чтобы скопировать эту информацию в блокчейн. Очевидно, минимум ~95% инвесторов так никогда и не заплатят. Но информация уже в Ethereum блокчейне. GAMB намеренно заливает в блокчейн никому не нужный мусор. Помните CryptoKitties и зависания сети Ethereum? Это тоже самое, только лишенное смысла.
Подсчеты показали, что GAMB занес примерно 13000 крипто кошельков инвесторов и на это было потрачено $2079! $2K — это плата за газ, чтобы выполнить транзакции по регистрации персонального кошелька в смарт контракте. Инвесторы еще не заплатили, а основатели уже потратили деньги. Разумеется, на фоне якобы собранных $11,5M это несущественно. Но GAMB — крайне плохой пример расточительности, все можно сделать по другому, бесплатно, не плодить мусорные транзакции.
Перепроверить расчеты можно, сделав экспорт данных по этому адресу:
https://etherscan.io/exportData?type=address&a=0xe2a0e69b0f21f1afcd5ab93ecd892fbf0f2ed2e1
Т.к. они якобы собрали около 30% HardCap, то всего за ICO на такие паразитные операции потратят ~$6000 (грубая оценка). За эти деньги можно было заказать в CryptoB2B нормальный смарт-контракт, не требующий выбрасывать деньги на воздух.
Исходя из предыдущей главы GAMB заработал $74000, потратил $2000 на технические потери (газ), на сайте зарегистрировалось около 13000 потенциальных инвесторов, но реально заплатили только 83 человека.
Открытость Личного Кабинета по продаже токенов
Эта глава не имеет отношения к анализу уязвимостей, но показывает небольшую неосведомленность основателей проекта. Как бы совет всем остальным: не делайте, как GAMB, чтобы повысить свои сборы. GABM собрал хорошую сумму — но это не повод делать так же всем.
Когда входишь на сайт Личного Кабинета для ICO — сразу натыкаешься на форму регистрации. Далее не пройти без регистрации. Это снижает некоторую конверсию среди потенциальных клиентов. Совет: не делайте так. Показывайте максимум информации клиенту. Старайтесь их сначала заманить, показать крутой и сделанный профессионально Личный Кабинет для продажи токенов. Но не позволяйте самую малость — оплатить. Это только после оплаты. Потенциальный клиент, возможно, просто хочет походить по Персональную Кабинету, чтобы получить информацию, которой не было на других страницах Лендинга. Клиент, возможно, хочет просто оценить качество и наличие Кабинета. Ведь все наслышались про scam. Дорогой и профессиональный продукт доказал бы солидность ICO. Но клиента никуда далее формы регистрации не пускают.
Слишком жесткие KYC процедуры
Эта глава, как и выше, так же с советом, а не уязвимости. Не делайте, как это сделали в GAMB.
Клиент после регистрации не может заплатить, пока не пройдет KYC процедуры. Зачем так делают? Очевидно — юристы так сказали. Мы проводим очень много ICO (более 350 за 2 года) и все это знаем. Но юристы перегибают палку. Если клиент прошел первый не сложный барьер (в виде регистрации) и натыкается сразу на второй (в виде KYC) — вы убиваете желание человека вам отдать деньги. Сложно гадать, на сколько снижается конверсия и насколько богаты те клиенты. Вероятно, если человек пошел регистрироваться и не прошел KYC, то это человек, который не до конца был уверен платить или нет (иначе бы он KYC прошел бы до конца). Так же вероятно, это не человек с небольшой суммой оплаты (точно не фонд или крупный инвестор). Очень сложно гадать (ICO еще идет), но пусть будет 1000 потерянных человек со скромной суммой в 5 ETH, это $2,5M несобранных сборов.
Идея заключается в том, что не юристы должны давить на фаундера и усложнять жизнь по сбору денег, а наоборот, юристы и бухгалтеры должны служить основателю (в реальности — основатель проекта «прислуживает» юристам). Если вы абсолютно уверены в корректности такого способа — ваше право, игнорируйте данную главу.
Так вот, очевидный совет состоит в том, что сначала надо позвонить пользователю заплатить (без KYC) и сразу выдать ему замороженные токены. Сразу отвечаем на критику:
- Судя по нашей практике, около 50% пользователей сами заполняют о себе все документы с первого раза. Т.е. кто хочет пройти KYC — проходит до платежа. При этом среди документов на KYC очень низкий процент фейков, когда вместо паспорта загружают цветы (2-5%).
- Вторая половина пользователей в 50% становятся вашими пользователями, нажав «SKIP» во время KYC.
- От момента старта ICO до окончания последнего раунда, если у вас 2 раунда, обычно проходит 4-7 месяцев. Так же вы после ICO спокойно берете паузу (она объявлена заранее) в 1-2 месяца на всякого рода проверок по KYC. Итого, у вас есть минимум целых ПОЛГОДА, чтобы повлиять на тех, кто уклонятся от KYC.
- Если кто-то злостно уклоняется от KYC вы в течении месяца после ICO просто откатываете сделку, вернув тому пользователю его деньги и никогда не размораживая токены. Токены все это время были заморожены в кошельке клиента, он их там видел, но ничего с ними сделать не смог. В дополнение токены можно отобрать (сжечь). Если вы их не сожжете, он будут вечно заморожены на балансе вашего смарт контракта. При сжигании, когда вы вернете деньги, они физически исчезают.
- Никаких юридических противоречий нет. Те замороженные токены — не токены. Токены — это актив, которым можно распоряжаться. Замороженный токен — не актив, т.к. инвестор не может с ним ничего сделать. С юридической точки зрения вы можете его назвать предварительной заявкой. Ведь никто не запрещает рассылать в блокчейне сообщения, котиков или просто подтверждение, что вы получили их деньги.
- С моральной точки зрения токен виден самому пользовалю в его личном кошельке, что стимулирует того пройти наконец-то KYC.
Если читатели будут идти по пути GAMB, то они к концу ICO окажутся в ситуации — идеально сделано с юридической точки зрения, только денег нет. Разумеется, мы не призываем нарушать законодательство. С этой целью ICO платформа Crypto B2B предлагает сразу 5 разных сценариев проведения KYC, от максимально жесткого (в духе GAMB), до наиболее оптимального, золотой середины между 2-мя целями: не нарушать закон + не снижать конверсию сбора денег.
Hardcap — лукавство
Не смотря, что Hardcap в смарт-контракте присутствует, однако, его можно обойти и обмануть инвестора:
Фаундер может сколь угодно долго продлевать ICO пока не будет набран HardCap. Или пока контракт не будет финализирован.
function delayIcoEnd(uint256 newDate) public onlyOwner { require(newDate != 0); require(newDate > now); require(!hasEnded()); require(newDate > endTime); endTime = newDate; }
Продлеваем до бесконечно ICO, пока не соберем нужную сумму.
HardCap определен и в смарт-контракте продажи, и в смарт-контракте токена, может быть выпущено ограниченное число токенов. Разумеется в нашей ICO платформе все честно. Абсолютно каждый пункт, описанный в этой статье, сделан по другому и соблюдает права инвесторов.
Softcap — ложь, обман
SoftCap в смарт-контракте не определен. Какой либо код на эту тему отсутствует. Все инвестиции сразу поступают на кошелек бенефициара. На сайте softcap=$5M и предполагается, что если эта сумма не собирается, то смарт контракт позволит инвесторам забрать деньги. На самом деле нет, они уже на счету компании.
Не понятно, почему они выбрали для лживого Softcap только $5M? Ведь у них сборы более $11,5! Могли бы объявить Softcap в $11,499,499, чтобы гарантированно его преодолеть.
Счетчик сборов в ETH — ложь, обман
В смарт-контракте есть стандартная переменная, которая считает, сколько денег (ETH) собрано. Но основатели GAMP ее напрямую изменили, в те самые $11,5M. Эту переменную допустимо менять реальными сборами, а не произвольными.
Основатели заложили себе аж 2 механизма изменять это число.
Первое, во время инициализации смарт-контракта в его конструктор:
constructor( uint256 _startTime, uint256 _endTime, uint256 _icoHardCapWei, uint256 _referralPercentage, uint256 _rate, address _wallet, uint256 _privateWeiRaised, uint256 _individualCap, address _utilityAccount, uint256 _tokenCap, uint256[] _vestingData )
были переданные следующие данные:
-----Decoded View---------------
Found 15 constructor arguments :
Arg [0] : 000000000000000000000000000000000000000000000000000000005b3ce0f0
Arg [1] : 000000000000000000000000000000000000000000000000000000005b607970
Arg [2] : 000000000000000000000000000000000000000000000e7289f37328e8c80000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [5] : 00000000000000000000000001e0c66def9faca90b2664378dd8aa9755b31270
Arg [6] : 00000000000000000000000000000000000000000000052bcf94094b7f100000
Arg [7] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [8] : 000000000000000000000000e2a0e69b0f21f1afcd5ab93ecd892fbf0f2ed2e1
Arg [9] : 00000000000000000000000000000000000000001027e72f1f12813088000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 0000000000000000000000000000000000000000021ed657c8e0d427f8400000
Arg [13] : 0000000000000000000000000000000000000000000000000000000003b53800
Arg [14] : 000000000000000000000000000000000000000000000000000000000003f480
0x52bcf94094b7f100000 / 10^18 * 450 = $10 989 000 (те самые $11,5M, погрешность на курсе)
Число 0x52bcf94094b7f100000 (выделено красным) можно найти на https://etherscan.io/address/0x66323324b77d72c65ea76caa918464836498ebd6#code в самом низу.
Далее, второй механизм. Это число до начала раунда основатель мог изменить как угодно (бесконтрольно), благодаря следующему коду:
function increaseWeiRaised(uint256 amount) public onlyOwner { require(now < startTime); require(amount > 0); require(weiRaised.add(amount) <= hardCap); weiRaised = weiRaised.add(amount); } function decreaseWeiRaised(uint256 amount) public onlyOwner { require(now < startTime); require(amount > 0); require(weiRaised > 0); require(weiRaised >= amount); weiRaised = weiRaised.sub(amount); }
Попутно заметим, это 12 строк кода на изменение 1 переменной — это перебор и слабый код. Хватило бы и 4 строк, в одну функцию. Много кода нужно писать, когда код что-то делает, здесь же он никак основателя не ограничивает, кроме двойной проверки по дате.
Начисление бонусов — нарушение прав инвесторов
Основатель имеет метод для ВЫБОРОЧНОГО начисления токенов своим инвесторам. В результате обработки отдельной записи инвестор получит токены по базовой цене в соответствии с размером инвестиции, плюс бонусные токены в количестве явно указанном фаундером.
Например, одному инвестору можно сделать бонус поменьше. А если основатель сам покупает свои токены, то бонус такому «покупателю» можно сделать побольше. В теории, основатель может благодаря бонусу бесплатно забрать себе все нераспроданные токены.
Разное
На сайте проекта, нет ссылок на GitHub или иной репозиторий где можно было бы ознакомится с кодом проекта. С целью провести аудит контракта сбора средств и контракта токенов.
На самом деле, требование выкладывать код на GitHub — очень глупое и архаичное. Суть в том, что код нужно показать. Но лучше не GitHub, а на Etherescan. Последний подтвердит, что выложенный код соответствует бинарному коду в блокчейне. GitHub, очевидно, ничего не подтвердит и можно выложить 2 разных версии, а из-за природной лени человека никто не будет проверять и компилировать код, что ведет к потенциальному мошенничеству (на GitHub честный код, а в блокчейне — любой иной). Мы упомянули GitHub только потому, что код намеренно был скрыт, а не потому, что призываем к GitHub. Наоборот. Еще раз повторим: GitHub — НЕ для публичного открытия исходников смарт-контракта с целью проведения его аудита. Это очень удобный проект, для другого типа кода, например, для собственной разработки блокчейн проектов.
Так же на сайте скрыт адрес сбора средств для пользователей не прошедших KYC. Что является довольно странным. Требовать от инвестора передать свои личные данные, не предоставив ему информации о способе сбора средств, не логично, если нечего скрывать.
Анализ Белой бумаги
В силу вопиющих подробностей сбора денег анализ Белой бумаги не проводили. Нет смысла тратить время программистов Crypto B2B на поиск технической составляющей проекта. Возможно, будет сделано позже. Пока будем считать, что с точки зрения идеи — проект великолепен и мы желаем ему успеха.
Кто рекламирует GAMB
На 25 июля это мошенническое ICO все еще висит на ICOdrops.com. Зачем они так делают?
Выход из ситуации
Первое — основателям нужно доказать наличие $11,5M. А так же афишировать, что это другие миллионы, а не те, что через публичный смарт контракт собираются.
Второе. Необходимо целиком сменить всю ICO платформу. Все указанные недостатки отсутствуют в ICO платформе от CryptoB2B. Но она, к сожалению, не позволила бы основателю манипулировать сборами и по другому ущемлять защиту интересов инвесторов. Судя по тому, что с момента открытия публичного ICO компания собрала всего $74000, вероятно, больше GAMP не соберет ничего. Поэтому, вероятно, менять платформу уже поздно в силу очевидного провала публичного сбора. Есть ли 11 миллионов или нет — не нам решать. Однако, подчеркнем, все уязвимости можно устранить, если систему для сбора денег пишут опытные разработчики.
Технический рейтинг проекта GAMB
Описание основной технической идеи? Не оценивали: +0.
[-10=отстуствует, 0=нейтрально, +5=присутствует]
Найдено ли явное техническое вранье (мошенничество)? Найдено. -5.
[-10=найдено, 0=не оценивали, +3=позитивно]
Имеет ли отношение к блокчейну основные функции проекта? Не оценивали, +0.
[-10=не имеет, 0=имеет, +10=экосистема]
Адекватность продажи токенов, защита интересов инвесторов? Ужасающе (негативно), -10.
[-10=нарушения, 0=не оценивали, +5=честное ICO]
Качество кода, ошибки в смарт контракте? Низкое качество (негативно). -2.
[-10=найдены ошибки, 0=не оценивали и/или ошибок нет, +5=хорошее качество]
Открытость команды к проведению аудита и ответам на неудобные вопросы? Скрывают (негативно), -5.
[-10=враждебность, 0=не проводили, +2=открыты к сотрудничеству]
Промежуточная оценка по формуле: -5-10-2-5 = -22 баллов. Числа меньше нуля или более 10 округляются до диапазона [0…10]. Итого: «-22» округляется до «0».
Градации оценки:
- -50 … -21 = экстремально плохо
- -20 .. -10 = очень плохо
- -9 … +0 = плохо
- +1 … +3 = так себе
- +4 … +9 = позитивно
- +10 .. +20 = отлично
- +21 и более = превосходно
Итоговый технический рейтинг cryptob2b по сумме показателей: 0 из 10, оценка — экстремально плохо.
Updated 29 Jul 2018
Во время первоначального аудита их виджет сбора денег показывал 12,8 млн сборов (скриншот выше). Сегодня 29 июля 2018 и виджет показывает:
Куда делись 400 000 долларов?