alembic

Контракт перегонного куба ambix.sol для прерванных ICO

У нас в Airalab есть вот такой контракт: Ambix.sol. Мы его планируем использовать для связи токена AIR первой фазы и второй.

По идеи, этот же контракт можно использовать для  прерванных ICO в результате обнаруженной уязвимости мульти-сиг кошельков, созданных в parity 1.5 и выше.

Описание контракта Ambix.sol

Контракт Ambix.sol позволяет преобразовать один набор токенов в другой  по заданному рецепту. Рецепт перегонного куба задается следующим выражением:

  (N1 * A1 | N’1 * A’1 | N»1 * A»1 …)
  & (N2 * A2 | N’2 * A’2 | N»2 * A»2 …) …
  & (Nn * An | N’n * A’n | N»n * A»n …)
  = M1 * B1 & M2 * B2 … & Mm * Bm
    where A, B — input and output tokens
          N, M — token value coeficients
          n, m — input / output dimetion size
          | — is alternative operator (logical OR)
          & — is associative operator (logical AND)

В процессе перегонки входной токен сжигается, и происходит эмиссия выходного токена.

function run() {
        TokenEmission token;
        uint value;
        uint i;
        uint j;

        // Take a source tokens
        for (i = 0; i < rSource.length; ++i) {
            bool tokenBurned = false;

            // Try to transfer alternatives and burn it
            for (j = 0; j < rSource[i].length; ++j) {
                token = rSource[i][j];
                value = rSourceCoef[i][j];
                if (token.transferFrom(msg.sender, this, value)) {
                    token.burn(value);
                    tokenBurned = true;
                    break;
                }
            }

            if (!tokenBurned) throw;
        }

        // Generate sink tokens
        for (i = 0; i < rSink.length; ++i) {
            token = rSink[i];
            value = rSinkCoef[i];
            token.emission(value);
            if (!token.transfer(msg.sender, value)) throw;
        }
}

Перегонный куб в его текущем виде не сможет работать с ERC20 токенами, не имеющими функции burn() и emission(). Соответственно  для обеспечения работы с контрактом Ambix.sol стандартных ERC20 токенов необходимо модифицировать контракт. После чего логика продолжения ICO может быть следующей.

Как продолжить прерванное ICO

ICO не могут продолжится из-за того, что бенефициаром собираемых средств в основном контракте ICO указан уязвимый контракт мульти-сига без возможности изменить этот адрес.

Вторая часть проблемы заключается в том, что эмиссия токенов передана основному контракту ICO, или же токены заранее были эмиссированы и переведены на счёт основного контракта ICO.

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

Я вижу, что это можно сделать так:

  1. Создается ERC20 совместимый контракт токена, имеющий функцию эмиссии. Как пример: TokenEmission.sol
  2. Создается новый основной контракт ICO с указанием нового бенефициара и нового созданного токена.
  3. Выполняется эмиссия не распространенных до атаки на мульти-сиг токенов и перевод их на новый основной контракт ICO.
  4. Создается контракт перегонного куба Ambix.sol , ему указывается рецепт, к примеру за один входной токен, создавать 1 новый токен (1:1).
  5. Контракт Ambix.sol  назначается эмитентом нового контракта токенов.

Тем самым мы получаем, что остатки токенов могут быть распространены и необходимые команде средства дополучены. Все токены, полученные до остановки ICO, смогут быть перегнаны в новый контракт токена. Сообщество может быть уверено, что дополнительные токены не будут созданы после ICO, т.к. функция эмиссия отдана безвозвратно контракту перегонного куба.

Как то так…