SmartSpace - Аренда

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

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

Разделы

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

Владельцу Space токена необходимо предоставить возможность получения дохода путем сдачи в аренду репутации Space токена.

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

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

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

Сценарий 1: Аренда для владельца земли

  1. Пользователь А имеет в собственности 1 Space токен, залоговая стоимость (репутация) которого составляет 2500 GALT. Он хочет заработать путем продажи репутации этого токена. Он создает смарт-контракт SmartSpaceBasic, где в качестве параметров указывает:

    • Длину одного периода - 3 дня (72 часа)
    • Размер ставки за один период и 100% репутации в нем. Например, 250 GALT за 100% репутации на 1 период.
    • Кол-во будущих периодов, доступных для вступления арендаторами - 5 периодов. Созданный контракт является не активным, все операции с ним заблокированы. Контракт ожидает поступления токена на его адрес.
  2. Пользователь А переводит свой Space токен на созданный в п.1 контракт.

    • Контракт развернутый в п. 1 активируется, операции с ним становятся доступными.
    • 100% репутации токена, находящегося на контракте, принадлежит владельцу контракта (Пользователь А). Технически, сначала репутация переводится от Пользователя А на контракт, а после контракт перераспределяет всю репутацию обратно Пользователю А.
  3. Любой пользователь может внести аренду за 0, 1, 2, 3, 4 и 5 периоды. Пользователь B переводит на контракт 100 GALT за 0 период.

    • Сохраняется timestamp текущей транзакции для дальнейшего рассчета периодов
    • Начинается 0 период
Пользователи A B
Репутация до 2500 0
Репутация после 1500 1000
  1. Период 0. Пользователь B вносит аренду за 3й период в размере 150 GALT.

    • Распределение репутации между участниками не происходит.
  2. Пользователь А не может вывести внесенные за аренду платежи, т.к. периоды еще не закончены и репутация не отозвана.

  3. Начинается период 1. Пользователь А отзывает репутацию участников периода 0 явным выполнением транзакции отзыва. На период 1 заявок на аренду нет.

Пользователи A B
Репутация до 1500 1000
Репутация после 2500 0
  1. Период 1. Теперь пользователь А может вывести 100 GALT оплаченные пользователем В за 0-й период. 150 GALT оплаченные за 3й период он вывести пока не может.

  2. Начинается период 2. Отзывать репутацию нет необходимости.

    • Распределение репутации между участниками не происходит.
  3. Период 2. Пользователь C вносит аренду в размере 200 GALT за 2й период.

Пользователи A B С
Репутация до 2500 0 0
Репутация после 500 0 2000
  1. Период 2. Пользователь D вносит аренду в размере 50 GALT за 2й период.
Пользователи A B С D
Репутация до 500 0 2000 0
Репутация после 0 0 2000 500
  1. Начинается период 3. Пользователь A забывает отозвать репутацию у участников 2-ого периода. Распределение репутации остается слеующим:
Пользователи A B С D
Репутация 0 0 2000 500

Пользователь B, который внес свой залог за 3-й период, по факту остается без оплаченной репутации.

  1. Начинается период 4. Пользователь А отзывает репутацию за период 2. Отзывать репутацию за период 3 уже не требуется.
  2. Период 4. Пользователь В может получить обратно свои 150 GALT, т.к. он не смог ими воспользоваться.
  3. Пользователь А блокирует вступление новых пользователей и продление аренды текущими.
  4. Пользователь А выводит платежи, поступившие в пунктах 9 и 10 (250 GALT в сумме) на свой адрес.
  5. Пользователь А выводит GALT токен с контракта на свой адрес. Технически, репутация сначала отзывается у пользователя А на адрес контракта, а потом, вместе с Space токеном, переводится ему обратно. Контракт блокируется для операций с ним.
  6. Пользователь А оставляет контракт развернутым, но т.к. он заблокирован, он бесполезен.

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

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

  • При деплое (создании) контракта аренды владелец контракта указывает следующие данные (в конструкторе):
    • Величину одного периода в часах. Например, 30 * 24 = 720 часов за 1 период.
    • Размер ставки за один период и 100% репутации в нем. Например, 250 GALT за 100% репутации на 1 период.
    • Кол-во будущих периодов, доступных для вступления арендаторами. Например, 5 - это значит, пользователь может уже внести арендную плату на 5 периодов (по 30 дней каждый) вперед, не включая текущий. На каждый период отдельная транзакция.
  • По умолчанию минимальный депозит за 1 период составляет 1 GALT. Может быть изменен отдельной транзакцией. В любом случае не может быть менее 1 GALT.
  • Перечислить токен на контракт аренды может только создатель контракта, при попытке перевода с других адресов, транзакция будет отклоняться.
  • При попытке перечислить второй токен на контракт, транзакция будет отклоняться.
  • После перевода токена вся репутация переводится владельцу контракта. Об этом контракт аренды явно уведомляет контракт репутации.

Вступление арендаторов

  • Внести аренду можно на текущий период и кол-во периодов вперед, указанное при создании контракта. Например, если там указано 5, и текущий период 7, внести аренду можно за 7, 8, 9, 10, 11, 12 периоды. Аренда за каждый из желаемых периодов вносится отдельной транзакцией. Размер аренды может меняться между периодами по желанию арендатора и при наличии свободных мест.

Вывод GALT собственником контракта

  • GALT, переведенные на контракт в качестве платежа за аренду, собственник контракта может вывести только после наступления следующийх двух событий:
    • Период, за который поступил платеж закончился.
    • Репутация была вовремя назначена и отозвана. Вовремя - это значит в любой момент за период. Если арендатора не устраивает, что репутация будет назначена в конце периода - он может выполнить транзакцию перераспределения репутации самостоятельно.

Изменение

Владелец может:

  • Закрыть контракт и вывести space токен, если ни на данный момент нет ни одного активного арендатора.
  • Приостановить вступление новых арендаторов.
  • Приостановить возможность продления для текущих арендаторов.
  • Изменить ставку ТОЛЬКО при отсутствии активных арендаторов.
  • Изменить минимальную ставку платежа за 1 период.
  • В начале каждого периода отзывать репутацию пользователей из предыдущего периода отдельной транзакцией.

Арендатор может:

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

Арендатор НЕ может:

  • Отозвать уже оплаченную аренду за любой период (исключение - в прошлом периоде репутация не была распределена).

Репутация

Изменения долей аренды отражаются в следующих контрактах:

  • локальная репутация (изменяется репутация адреса)
  • глоальная репутация (изменяется репутация адреса)
  • голосование (пока нет понимания, как это может работать в рамках solidity)

Отзыв репутации за прошлые периоды

  • Должна быть возможность отозвать репутацию за любой прошедший период только один раз
  • Необходимо простимулировать владельца контракта выполнять отзыв самостоятельно. Для этого средства за период не могут быть выведены, пока он не закончится и владелец не отзовет репутацию за него.
  • Хранение списка арендаторов при кол-ве участников за период в пределах 30 производится в блокчейне.
  • Хранение списка арендаторов при кол-ве участников за период более 30 ведется off-chain. Список арендаторов формируется путем прослушивания конкретных event-ов о внесении пользователем арендной платы и сохраняется в off-chain базу данных. Если арендодатель теряет базу данных, он может восстановить адреса, заново проиграв события за последние периоды.
  • Возможно, наша команда займется реализацией off-chain решения, но пока предеполагается, что этим будет заниматься сам арендодатель.
  • Технически у нас будет 2 метода для отзыва репутации:
    • withdrawAllReputation(periodId) - отзывает репутации у всех пользователей указанного периода
      • может быть вызвана любым пользователем
      • может быть исполнена только один раз
      • может быть исполнена только при кол-ве участников за указанный период менее 30
    • withdrawUsersReputation([addresses]) - отызвает репутацию у переданного массива адресов
      • используется в случае, если кол-во участников за период более 30
      • возможны прочие ограничения со стороны Solidity.

Математика

Рассчет репутации

R = floor(Tr * Ud / Rp)

  • R - арендуемая репутация пользователя в данные период (в GALT)
  • Tr - репутация токена (в GALT)
  • Ud - арендный депозит пользователя за данный период (в GALT)
  • Rp - ставка за 100% аренды на 1 период

Например:

  • Space токен имеет репутацию 1500 GALT
  • Ставка за 100% равна 250 GALT
  • Уплаченная пользователем аренда 60 GALT

Это означает, что:

  • R = floor(1500 * 63,53 / 250)
  • R = floor(1500 * 0,25412)
  • R = floor(381,18)
  • R = 381

Пользователь получает 381 GALT репутации на арендуемый период.

Рассчет текущего периода

Cp = (Ct - It) / L * 3600

  • Cp - текущий период
  • Ct - текущий timestamp
  • It - timestmap первого внесения денежных средств первым арендатором
  • L - длина периода в часах

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

TypeScript

  • В качестве текущего времени используется +Date.now()

Solidity

  • В качестве текущего времени используется timestamp последнего блока

Проблемы

  • Нам нужно решение, которое позволит делать аренду на 5000 участников. Это требование. Аренда на 30 человек - не наш кейс.
  • Существует вероятность того, что в начале нового периода пользователь не отзовет репутацию у предыдущих владельцев. Например он забудет это сделать. И пока он этого не сделает, репутация токена будет числится за участниками предыдущего периода аренды. Если же владелец вовсе этого не сделает - у нас получится период, в котором репутация не была распределена корректно.
    • Вариант 1. Добавить централизованный сервис, который будет выполнять отзыв репутации за заренее перечисленные владельцем контракта эфирки.
    • Вариант 2. вариант - позволять любому пользователю выполнить отзыв репутации за свои эфирки
    • Опционально можно компенсировать пользователю выполнение транзакции. Для этого владелец должен хранить определенную сумму в эфирах на контракте. https://ethereum.stackexchange.com/a/42415/20417 (решение требует проверки)

results matching ""

    No results matching ""