Пишем смарт-контракт Ethereum — это просто: Часть 11 — ICO, refund — возврат средств по softcap

В предыдущей статье мы познакомились с видами эмиссий и научились верифицировать контракт в etherscan. Теперь наша задача создать механизм возврата средств, тем самым повысив доверие инвесторов.

В некоторых ICO для реализации проекта необходима какая-то минимальная сумма. Так называемый softcap. Если основатели ее не собирают, то проект выполнить невозможно.

Зачем нужен механизм возврата средств по softcap?

  1. Если во время ICO softcap не был достигнут, то получается что и деньги у вас и проект не будет выполнен. В этом случае, если вы не вернете средства, то инвесторы могут посчитать вас обманщиком.
  2. Наличие возврата денег повышает доверие инвесторов.

Когда возврат по softcap не нужен?

  1. Если ваш проект не имеет минимальной суммы для реализации. Например, если у вас проект по инвестициям в валюты, то тут минимальная сумма не нужна. В любом случае можно инвестировать любую сумму.
  2. Когда вы четко прописываете в WhitePaper, что при недостижении softcap инвестиции не возвращаются (это может быть оправдано как покрытие расходов на запуск ICO).
  3. Если вы достаточно уверены в том, что соберете softcap. Такая уверенность может основываться на результатах сбора во время presale например.

Как сделать механизм возврата средств?

Возврат средств может быть реализован как на пресейле так и на ICO. Работает он достаточно просто. Во время ICO средства инвесторов перечисляются не специальный счет-контракт. С этого счета основатели не могут вывести деньги до окончания ICO. По окончанию можно проверить — достигнут ли softcap. Если не достигнут, то средства остаются на специальном счете и инвесторы могут вернуть себе средства путем вызова специальной функции возврата. Обычно ее называют refund. Если же softcap был достигнут, то средства со спец-счета переводятся на счет основателей.

Давайте приступим к нашей реализации. За основу мы возьмем код 9-го урока.

Для простоты средства инвесторов у нас будут собираются на счету контракта распродажи.

Нижняя граница сборов softcap у нас будет хранится в переменной sotfcap.

Если softcap не достигнут и ICO закончено, то пользователи смогут вывести средства с помощью функции refund.

Вначале идет проверка, что баланс контракта больше softcap  и что ICO уже закончилось. Но как же нам возвращать средства инвесторов, если мы не знаем сколько каждый инвестировал?

Для этого во время инвестирования мы будем сохранять адрес инвестора и сколько он инвестировал в мэпе:

Поправим функцию продажи токена, чтобы она сохраняла сумму инвестора. Добавим строчку в конец. И уберем перечисление средств на multisig. Теперь средства остаются на контракте распродажи.

Теперь мы наконец можем дописать нашу функцию возврата средств.

В конце ICO при вызове finishMinting мы будем определять достигнут ли softcap. И если достигнут то будем переводить все средства с аккаунта контракта на кошелек основателей. Также все остальные действия из этой функции будут выполняться только в случае достижения softcap. Иначе они не имеют смысла.

На этом наши доработки закончились, вот весь код.

Теперь наши инвесторы могут быть уверены, что смогут забрать средства, если проект не вложений будет недостаточно для реализации  проекта.

Вы можете спросить — почему нельзя автоматически вернуть средства? Почему именно сам инвестор должен вызвать refund, чтобы вернуть? Дело в том что на каждую инструкцию тратится газ. Представьте что у нас несколько тысяч инвесторов. В этом случае расходы на рассылку резко возрастут. Именно поэтому мы не делаем автоматическое возвращение средств в finishMinting.

Как уже знаете всегда лучше использовать готовое решение. Refund — это хорошо известный механизм и он имеет свою реализацию в OpenZepplein. Она гораздо сложнее чем та что описана в этой статье, но принцип тот-же. Эта реализация состоит из двух контрактов.

  1. RefundableCrowdsale — контракт для проведения ICO с возможностью возврата средств.
  2. RefunValut — специальный контракт-счет для хранения средств до окончания ICO.

Разбор шаблона OpenZepplin оставим для самостоятельной подготовки.

Продолжение читать тут. Предыдущий урок тут.

Если у вас возникли вопросы то можете смело писать на электронную почту (раздел «контакты«). Также приветствуется критика.

Если статья показалась вам полезной и вы желаете отблагодарить автора, то это можно сделать отослав немного эфира на адрес 0xEA15Adb66DC92a4BbCcC8Bf32fd25E2e86a2A770.

Полный список уроков тут.

  1. А можете подсказать, есть ли готовые решения для организации приёма инвестиций в BTC и других валютах, чтобы мы, зная адрес ETH кошелька инвестора выдавали ему токены автоматически при поступлении денег на счёт в другой сети. Не sidechain типа btcrelay.org.

  2. Верно ли, что взаимодействие контракта и владельца, после публикации в продакшн сеть, происходит только в автоматическом режиме (согласно той логике, что мы запрограммировали)? Чеканка, бонусы, баунти, возвраты и т.п.

    • Не понял что имеется в виду под автоматикой. Код контракта выполняется только если функцию контракта кто-то вызвал. Чеканка и начисление бонусов выполняется, когда пользователь отправил средства. Именно отправка эфира на контракт запускает процесс чеканки и начисления бонусов.
      Токены на баунти выпускаются когда владелец контракта вызвал finishMinting. (Они только выпускаются, распределением занимается человек)
      Возврат средств инвестору выполняется, если инвестор вызвал функцию refund.

  3. А можно ли в контракте получать текущий курс ETH/USD и на основании этого формировать рейт нашего токена, чтобы он всегда имел фиксированную сумму в долларах (скажем $0.5) и не менялся от колебаний курса?

  4. Александр, доброго времени суток, благодарю Вас за создание этого пособия, очень интересно и полезно, но есть несколько вопросов.
    1) Можно ли в начале создать монету, а потом через некоторое время запустить pre Sale — продажу самым ранним инвесторам по одной цене, после 2-3 мес, запустить Pre ICO — продать монету уже по другой цене всем интересующимся, а потом ещё через некоторое время запустить ICO и распродать монету остальным желающим?
    2) Можно все начисления в Баунти, команде, в фонд развития и т.д уже делать после ICO?

    Имеется идея экологического проекта, а что бы её реализовать я хочу создать свою криптовалюту, в принципе разобрался что к чему, но есть некоторые нюансы, которые в принципе уже задал )

  5. Спасибо за статьи и ссылки! У меня вопрос, что происходит с токенами в случае refund? Судя по коду у вас и zeppelin они остаются разданы инвесторам. Или я что-то упускаю? Токены мы начеканили, но вернули обратно только эфир, за который их купили, а токены так и остались на счетах инвесторов

    • Верно. Они остаются у инвесторов. А нам нет смысла с ними в этом случае что-то делать. Наша задача вернуть деньги. Хотя можно рассмотреть такой вариант когда при отсылке токенов на определенный контракт токены уничтожаются, а обратно возвращаются средства.

  6. Спасибо за цикл статей.
    Я не понял одного момента. В какой момент токены оказываются в кошельке у инвестора, заплатившего за них? Я сейчас всё это запустил. Деньги со счета инвестора снимаются, на адрес crowdsale падают. А у инвестора на счету не появляется токенов. Или я что-то не так понял? Хотя если обратиться к геттеру balance контракта crowdsale, то я получаю в ответ количество эфира, которое перевел инвестор. А как узнать сколько у инвестора токенов?

  7. Опечатка, по исправлении этот пост можно удалить
    Во время ICO средства инвесторов перечисляются не специальный счет-контракт.
    Во время ICO средства инвесторов перечисляются на специальный счет-контракт.

Добавить комментарий