Контракт обратного выкупа Galt токена - Требования

Описание проблемы

Каждый пользователь имеет право в любой момент вернуть свои ETH, которые он потратил на покупку Galt токена.

Цели контракта

  • Сделать контракт, который позволит пользователю обменивать Galt токены на ETH;

Сценарий контракта

Сценарий 1: Обратный выкуп

Вводные пользователя Б:

Адрес пользователя Баланс в Galt Баланс в ETH
0xca2...88f 30 000 10
Остальные адреса X Y

Фонды:

Адрес фонда Баланс в ETH Баланс в GALT Репутация
0xa0a...b2b 100 200 000 125 000
0x7ca...90c 400 800 000 375 000

Контракт адрес выкупа:

Баланс в GALT
15 000

Выход из GALT использует раунды эмиссии

  1. Начинается раунд 1.
  2. Пользователь Б создает заявку на вывод GALT вызывая метод createProposal контракта GaltExit. В аргумент к методу Пользователь Б передает кол-во GALT (5 000), которые он хочет обменять.
  3. Раунд 1 окончен. Начинается раунд 2.
  4. В течении раунда 2 пользователь Б для КАЖДОГО фонда вызывает метод executeProposalForFund контракта GaltExit, передавая в аргумент адрес фонда за предыдущий. Метод рассчитывает сколько Galt должен выкупить каждый фонд, пропорционально балансам их в ETH по формуле: (БАЛАНС ETH УКАЗАННОГО В АРГУМЕНТЕ ФОНДА / ЗАФИКСИРОВАННОЕ БАЛАНС ETH ВСЕХ ФОНДОВ) * КОЛИЧЕСТВО GALT ОТ КОТОРЫХ ОТКАЗЫВАЕТСЯ ПОЛЬЗОВАТЕЛЬ
Адрес фонда Баланс в ETH Баланс в GALT GALT за которые заплатит фонд
0xa0a...b2b 100 200 000 (100 / 500) 5 000 = 0.2 5 000 = 1 000
0x7ca...90c 400 800 000 (400 / 500) 5 000 = 0.8 5 000 = 4 000

5.Текущий курс GALT к ETH который определяется по формуле:

(ОБЩЕЕ КОЛ-ВО ВЫПУЩЕННЫХ GALT - БАЛАНС АДРЕСА ВЫКУПА) / ОБЩИЙ БАЛАНС ETH ВО ВСЕХ ФОНДАХ (2 000 000 - 15 000) / 500 = 3 970

  1. На основе курса GALT к ETH пользователю из каждого фонда выплачивается соответствующее количество ETH в обмен на GALT по формуле:

GALT ЗА КОТОРЫЕ ЗАПЛАТИТ ФОНД / КУРС GALT к ETH

Адрес фонда Баланс в ETH Баланс в GALT GALT за которые заплатит фонд ETH которые получит пользователь
0xa0a...b2b 100 200 000 1 250 1 000 / 3 970 = 0.251
0x7ca...90c 400 800 000 3 750 4 000 / 3 970 = 1.007

Балансы пользователя Б на окончание 1-ого раунда:

Адрес пользователя Баланс в Galt Баланс в ETH
0xca2...88f 25 000 11.258
Остальные адреса X Y

Фонды:

Адрес фонда Баланс в ETH Баланс в GALT
0xa0a...b2b 99,749 200 000
0x7ca...90c 398,993 800 000

Контракт адрес выкупа:

Баланс в GALT
20 000
  1. Раунд 2 окончен.

Сценарий 2: Выкуп Galt с контракта адрес выкупа

Вводные пользователя В:

Адрес пользователя Баланс в Galt Баланс в ETH
0xca2...88f 0 30
Остальные адреса X Y

Фонды:

Адрес фонда Баланс в ETH
0xa0a...b2b 200
0x7ca...90c 800

Контракт адрес выкупа:

Баланс в GALT Баланс в ETH
150 000 0
  1. Пользователь В вызывает метод BuyGalts, передавая в аргумент к методу кол-во Galt, которые он хочет выкупить (10 000).
  2. Расчитывается курс, по которому пользователь выкупает Galt (ОБЩИЙ ВЫПУСК Galt - БАЛАНС АДРЕСА ВЫКУПА) / ОБЩИЙ БАЛАНС ЭФИРОВ ВО ВСЕХ ФОНДАХ = (4 000 000 - 150 000) / 1000 = 3 850 Galt за 1 ETH. Затем по курсу производится обмен Galt на ETH = 10 000 / 3850 = 2,59 ETH за 10 000 Galt. Пользователю В перечисляются 10 000 и отнимаются 2,59 ETH. Полученные от пользователя ETH сохраняются в реестр по номеру текущего раунда эмиссии.

Вводные пользователя В:

Адрес пользователя Баланс в Galt Баланс в ETH
0xca2...88f 10 000 27,41
Остальные адреса X Y

Фонды:

Адрес фонда Баланс в ETH
0xa0a...b2b 200
0x7ca...90c 800

Контракт адрес выкупа:

Раунд Баланс в GALT Баланс в ETH
1 140 000 2,59

Сценарий 3: Получение ETH фондами

Пользователи:

Адрес пользователя Баланс в Galt Баланс в ETH
0xca2...88f 10 000 27,41
0xfc1...2a8 70 000 35
Остальные адреса X Y

Фонды:

Адрес фонда Баланс в ETH Баланс в ETH
0xa0a...b2b 200 200
0x7ca...90c 800 800

Контракт адрес выкупа:

Раунд Баланс в GALT Баланс в ETH
1 140 000 2,59

Реестр репутации в эмиссии:

Раунд Адрес фонда Репутация фонда
1 0xa0a...b2b 200 000
1 0x7ca...90c 800 000
  1. Начинается раунд 2.
  2. Пользователь 0xca2...88f вызывает метод ClaimEthForFund, передавая в аргумент адрес фонда 0xa0a...b2b. Если раунд окончен и в прошлом раунде реестра эмиссии присутствует адрес фонда (0xa0a...b2b), и баланс адреса выкупа на предыдущий раунд > 0 ETH, то пользователь выполняет транзакцию и ETH перечисляются на фонд по формуле ETH НА БАЛАНСЕ АДРЕСА ВЫКУПА ЗА ПРЕДЫДУЩИЙ РАУНД (РЕПУТАЦИЯ ФОНДА / ОБЩАЯ РЕПУТАЦИЯ ФОНДОВ) = 2,59 (200 000 / 1 000 000) = 0,518 ETH получает фонд 0xa0a...b2b.

  3. Те же действия выполняет пользователь 0xfc1...2a8 с фондом 0x7ca...90c. 2,59 * (800 000 / 1 000 000) = 2,072

Фонды:

Адрес фонда Баланс в ETH Репутация
0xa0a...b2b 200,518 200 000
0x7ca...90c 802,072 800 000

Спецификация контракта

Модель расчетов в Google Sheets

Для обратного выкупа Galt и получения ETH фондами используются общие раунды

Детальный Сценарий пользователя и описание интерфейса

Ограничения для реализации на Solidity

Ограничения для реализации на TypeScript

Еще не реализовано.

Неоднозначные вопросы и ответы на них

В каком виде должны хранится GALT в контракте "адрес выкупа"?

По какому курсу пользователи смогут купить GALT в контркте "адрес выкупа"?

Сколько часов должен длиться один раунд?

Какое различие можно допустить при сравнении общего кол-ва всех зафиксированных репутаций на момент вызова

finishProposal от общей репутации во всех фондах? 1% или больше?

Сколько должен длится один раунд?

Фундаментальная проблема

Если будет 2 фонда, у одного будет 30% Репутации и 70% эфиров, а у другого 70% Репутации и 30 % эфира, то схема убьет фонд с маленьким количеством эфира. Ситуация возможна, когда один фонд активно вкладывает и в него верят, а второй фонд не вкладывает и держит деньги.

Наша задача сделать так, чтобы был баланс и была невозможна атака. Есть 2 Варианта:

  • определять пропорции по репутации
  • определять пропорции по балансам в эфирах
Вариант 1 - по репутации

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

Вариант 2 - по балансам в эфирах

Будет забирать деньги у фондов, которые держат деньги и не инвестируют. То есть имеют большие резервы.

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

results matching ""

    No results matching ""