У нас в 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 с указанием нового бенефициара.
Я вижу, что это можно сделать так:
- Создается ERC20 совместимый контракт токена, имеющий функцию эмиссии. Как пример: TokenEmission.sol
- Создается новый основной контракт ICO с указанием нового бенефициара и нового созданного токена.
- Выполняется эмиссия не распространенных до атаки на мульти-сиг токенов и перевод их на новый основной контракт ICO.
- Создается контракт перегонного куба Ambix.sol , ему указывается рецепт, к примеру: за один входной токен создавать 1 новый токен (1:1).
- Контракт Ambix.sol назначается эмитентом нового контракта токенов.
Тем самым мы получаем, что остатки токенов могут быть распространены, а необходимые команде средства — дополучены. Все токены, полученные до остановки ICO, смогут быть перегнаны в новый контракт токена. Сообщество может быть уверено, что дополнительные токены не будут созданы после ICO, т.к. функция эмиссия отдана безвозвратно контракту перегонного куба.
Как-то так…