SmartSpace - Совместная собственность

Контракт аренды Space токена SharedSpaceBasic.

Контракт не является частью инфраструктуры фондов.

Разделы

Цели

  • Сделать так, чтобы залог в GALT и репутацию одного участка можно было разделить между большим количеством адресов (совместных владельцев) без разделения самого участка.
  • Сделать так, чтобы участок можно было передать другому адресу только решением 100% его совместных владельцев.
  • Сделать так, чтобы совместные владельцы имели такие же возможности, как единоличные владельцы земли.
  • Сделать так, чтобы каждый владелец мог передать свой залог и свою репутацию другому адресу или сделать обратный выкуп у Фонда.

Термины

  • Токен совместной собственности на землю - когда текущий собственник выставляет Земельный участок на продажу, в контракте фиксируется его общая цена, исходя из желания текущего собственника. Фактически создаётся внутренний токен контракта, который учитывает, какая доля земли, исходя из ее рыночной стоимости принадлежит каждому владельцу.
    • Каждый новый владелец может обменять GALT на Токен совместной собственности.
    • На основании количества токенов совместной собственности и Залога за участок рассчитывается Репутация пользователя.
    • Токен совместной собственности можно передать другому адресу или в свою очередь продать полностью или частично другим пользователям.

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

Сценарий 1.

  1. Пользователь A имеет в собственности Space токен, залоговая стоимость которого составляет 2500 GALT.
    • 2500 репутации принадлежат пользователю А
  2. Пользователь B создает контракт совместной собственности и просит друга (A) -владельца перечислить туда Space токен. Параметры для создания контракта:

    • 100% репутации за Space токен предлагаются на рынке за 5000 GALT
    • Владелец контракта получает 3000 GALT раночной стоимости (60%) При создании контракта:
    • Внутри контракта выпускается токен совместной собственности объемом 5000 GALT.
    • При этом никаких изменений в репутации, т.к. токен еще не перечислен. Работа с контрактом заблокирована - ожидается поступление Space токена
  3. Пользователь A перечисляет свой Space токен на контракт.

    • Работа с контрактом активируется.
    • Пользователь А получает всю репутацию токена 2500 GALT, более детальное распределение:
      • 1500 GALT - реальная собственность пользователя А (токены совместной собственности токены хранятся на адресе пользователя А)
      • 1000 GALT - нераспределенная репутация (токены совместной собственности хранятся на адресе контракта, но репутация распределена пользователю А)
    • Другие участники могут приобрести репутацию не более 40% или 1000 GALT (2500 - 3000/5000 * 2500 = 1000)
Пользователи A B Контракт
Репутация до 2500 0 0
Репутация после 2500 0 0
Токены совместной собственности до 0 0 0
Токены совместной собственности после 3000 0 2000
GALT токены до 5000 5000 0
GALT токены после 5000 5000 0
  1. Пользователь B вносит залог 1500 GALT
    • 750 репутации принадлежат пользователю
    • 1750 репутации принадлежат контрату
Пользователи A B Контракт
Репутация до 2500 0 0
Репутация после 1750 750 0
Токены совместной собственности до 3000 0 2000
Токены совместной собственности после 3000 1500 500
GALT токены до 5000 5000 0
GALT токены после 5000 3500 1500
  1. Пользователь А выводит залог пользователя B на свой адрес
Пользователи A B Контракт
Репутация до 2500 0 0
Репутация после 1750 750 0
Токены совместной собственности до 3000 0 2000
Токены совместной собственности после 3000 1500 500
GALT токены до 5000 3500 1500
GALT токены после 6500 3500 0
  1. Пользователь С выполняет попытку внести 1000 GALT залога для получения 500 GALT репутации. Транзакция отменяется, т.к.:

    • 2500 - общая залоговая стоимость Space токена
    • 1500 - репутация владельца контракта не может опуститься ниже этого порога
    • 750 - репутация принадлежит пользователю B
    • 250 - репутация, доступная для покупки за 500 GALT
  2. Пользователь B переводит 500 токенов совместной собственности (250 репутации) пользователю D.

Пользователи A B D Контракт
Репутация до 2500 750 0 0
Репутация после 1750 500 250 0
Токены совместной собственности до 3000 1500 0 500
Токены совместной собственности после 3000 1000 500 500
GALT токены до 6500 3500 0 0
GALT токены после 6500 3500 0 0
  1. Пользователь D вызывает функцию, согласно которой, фонд обязан выкупить репутацию любого пользователя кроме владельца по цене, рассчитаной в соответствии с залоговой стоимостью токена.
Пользователи A B D Фонд Контракт
Репутация до 1750 500 250 0 0
Репутация после 1750 500 0 250 0
Токены совместной собственности до 3000 1000 500 0 500
Токены совместной собственности после 3000 1000 0 500 500
GALT токены до 6500 3500 0 56000 0
GALT токены после 6500 3500 500 55500 0

Пользователь D получил 250 GALT и лишился всей своей репутации в рамках данного контракта.

  1. Пользователи A, B и Фонд голосуют за вывод токена на адрес F.

    • Пользователь A голосует за
    • Пользователь B голосует за
    • Фонд голосует против Транзакция по выводу токена не может выполнена.
  2. Фонд меняет свой голос на за. Теперь можно вывести токен на адрес F. Выполнить транзакию возможно пока статус всех голосов находится в состоянии за.

  3. Пользователь B вызывает и оплачивает транзакцию вывода. Space токен переводится на адрес F. Все токены совместной собственности переносятся на адрес контракта без какой-либо компенсации.

Пользователи A B D F Фонд Контракт
Репутация до 1750 500 0 0 250 0
Репутация после 0 0 0 2500 0 0
Токены совместной собственности до 3000 1000 0 0 500 500
Токены совместной собственности после 0 0 0 0 0 5000
GALT токены до 6500 3500 500 0 55500 0
GALT токены после 6500 3500 500 0 55500 0

Спецификация

Создание контракта

  • Создать контракт совместной собственности должен пользователь, который в дальнейшем пречислит на него Space токен.
  • При создаии контракта указываются следующие параметры:
    • Рыночная стоимость 100% репутации Space токена. Она может быть как меньше так и больше заложенного за токен депозита.
    • Рыночная стоимость процента репутации, которая будет принадлежать адресу владельца контракта.
  • При попытке перевода второго токена на контракт транзакция отменяется.
  • Созданный контракт является не активным, пока на него не будет передан один space токен.
  • После перевода Space токена, выпускается внутренний ERC20 токен в объеме, указанном в конструкторе. Этот объем приравнивается к 100% репутации.

Вход участников

  • Минимальный депозит задается в контракте и не может быть менее 1 GALT

Изменение доли

Покупка свободной доли у контракта

  • Пользователь может в любой момент без каких либо ограничений докупить свободную долю (токены) у контракта за GALT. Владалец контракта сразу же может вывести GALT токены, полученные при продаже токенов совместной собственности.

Передача доли другому пользователю

  • Пользователь может в любой момент передать как часть так и весь свой депозит (токены) любому другому пользователю.

Продажа доли другому пользователю через контракт

  • Пользователь делает заявку, сколько токенов совместной собственности он хочет продать и по какой цене в GALT.
  • Первые 7 дней (неменяемый параметр) выкупить токены совместной собственности могут только пользователи, у которых уже есть токены этого контракта.
  • После 7 дней выкупить токены совместной собственности может любой пользователь.
  • Продавец может создать whitelist адресов, которым разрешено купить токены совместной собственности (не применяется к текущим владельцам внутенних токенов)
  • Продавец может указать минимальный порог продажи за 1 транзакцию. При подаче заявки этот объем не должен превышать общий объем продаваемых токенов. Если остаточный объем для продажи становится меньше этого порога, разрешается только продажа всего остатка.

Штрафы Space токена

  • В случае, если к Space токену применяются штарфные санкции, репутация списывается у всех участников пропорционально депозиту с округлением в меньшую сторону до целых.
  • Объем токенов совместной собственности в случае штрафов не меняется.

Голосование

  • При голосовании учитывается кол-во токенов совместной собственности конкретного пользователя.
  • Если пользователь уменьшает или увеличивает свою долю в тот момент, когда идут какие-либо голосования, в них так же перерасчитывается доля пользователя.

Выход участников

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

Удаление контракта

  • Вывести SpaceToken токен возможно лишь совместным голосованием, согласие всех участников должно быть 100%.
  • При выводе токена:

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

Прочее

  • Залоги пользователей отношением адрес => залог в GALT (mapping(address => number))
  • На каждое изменение пользовательского залога происходит соответствующее изменение в контрактах Loacal Reputation и Global Reputation
  • Мы не можем хранить список пользователей владельцев участка, это потребует добавления цикла. Поэтому у нас не будет функционала отображения всех пользователей, которые учавствуют в контракте. (аналогичный функционал в ERC20 токене)
  • Единственное голосование всех участников возможно по поводу вывода токена на другой адрес. Поэтому список голосов держим в отдельном mapping-е, а адрес, куда выводить отдельной строкой.
    • Поменять адрес вывода токена может только собственник контракта.
    • При смене адреса вывода сбрасываются все голоса за и против.

Технические аспекты

Solidity

Подход реализации сброса голосования за вывод токена. Чтобы сбросить голосование, инкрементируется currentVoting. Старые значения остаются в блокчейне, но уже не будут считаться актуальными.

pragma solidity ^0.4.24;

contract Test {
    mapping(uint => mapping(address => bool)) oks;
    uint needToReach = 1000;
    uint currentSum = 0;
    uint currentVoting = 0;

    function seed() {
        for (var i = 0; i < 100; i++) {
            var a = address(keccak256(i));
            oks[currentVoting][a] = true;
            currentSum += 10;
        }
    }

    function execute() {
        assert(needToReach == currentSum);
        // execute
    }

    function reset() {
        currentVoting = currentVoting + 1;
        currentSum = 0;
    }
}

Проблемы

  • Может ли владелец GALT токена выступить в роли участника и докупить долю?
  • Что делать с апатией голосования при большом кол-ве участников? Сейчас у нас требование 100% согласия участников на вывод токена

results matching ""

    No results matching ""