Контракт SpaceToken - Документаци

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

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

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

  • Создать отвечающий стандартам OpenZeppelin ERC721.
  • Сделать возможность учитывать Земельные участки любой произвольной формы;

Ограничения

Существует 2 типа SPACE - токенов:

  • SPACE - токен Геохеш-участка, у которого id представляет собой кодированный Геохеш, соответствующего Геохеш-участка.
  • SPACE - токен Упаковки, у которого идентификатор представляет собой 256-битную строку.

Общие принципы учета Земельных участков при помощи токенов стандарта ERC721.

Земную поверхность можно представить в виде набора уникальных 1e32 элементов, которые называются Геохеши. Каждый Геохеш состоит из 1-11 символов и имеет Ранг. Ранг Геохеша - количество символов в строке. Геохеш 7го ранга - w24qguf, Геохеш 8го Ранга - w24qgufe. Каждый геохеш одного Ранга состоит из 32 Геохешей, меньшего Ранга. Вместе они образуют структуру Дерева. Каждый элемент этого Дерева является уникальным для нашей планеты. Комбинация Геохешей разного Ранга, расположенных рядом, позволяет получить и адресовать любой произвольный участок Земной поверхности. Назовем эти произвольные Земельные участки - Упаковка.

c8301536c0

В системе учета, основой которого является токен стандарта ERC721, для каждого Геохеш-участка мы будем использовать ERC721 токен SPACE. При этом возникает Проблема двойного владения.

Проблема двойного владения - ситуация, когда токен w24qguf принадлежит пользователю А, а токен w24qgufe принадлежит пользователю Б. В такой ситуации нам нужно обеспечить механизм, при котором Владение токеном w24qguf и w24qgufe Пользователями одновременно невозможно.

Механизм обеспечения невозможности Двойного владения реализован через контракт SplitMerge. Контракт SplitMerge реализует логику, при которой, токен Геохеш-участка одного Ранга можно обменять на 32 токена Геохеш-участка меньшего ранга. И наоборот 32 токена Геохеш-участка меньшего Ранга можно обменять на 1 токен Геохеш-участка более высокого Ранга, но только, если все 32 токена принадлежат одному Пользователю. Обмен осуществляет контракт SplitMerge. Фактически это операция сборка - разборка Земельных участков. Таким образом и обеспечена невозможность одновременного Владения пользователями токенами Геохеш-участка Разного ранга.

_space_ - 2

В Дереве Зеленым помечены SPACE - токены, которыми Владеют пользователи.

На карте это выглядит таким образом:

c6fe01bce5

Контракт SplitMerge так же хранит соответствие между Токенами Упаковки и Геохеш-участка. Это фактически Правило упаковки Земельных участков. По этим Правилам упаковки Контракт SplitMerge осуществляет обмен токенов Упаковки и токенов Геохеш-участка и наоборот. Для каждого уникального SPACE - токена Упаковки возможна только одна комбинация токенов SPACE, на которые его можно обменять. Токен Упаковки нельзя обменять на токен Упаковки. Токены SPACE Геохеш-участков в упаковке могут иметь разный Ранг, но должны граничить друг с другом. Пользователь может выполнить обмен только, если у него есть все токены SPACE Геохеш-участков, определенные Правилом упаковки.

_space_

Вот так это выглядит на Карте:

d462d8a20f

Если Пользователь выполнит обмен токена SPACE Упаковки с контраком SplitMerge, то картина будет выглядеть следующим образом:

_space_ 1

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

Универсальное правило: Все токены SPACE образуют Дерево, где токены Геохеш участков большего Ранга включают в себя токены Геохеш участков более низкого ранга по принципу один ко многим. Токены Упаковок могут включать в себя любые комбинации токенов Геохеш - участков разных Рангов, если они граничат друг с другом. На каждом уровне Дерева пользователи могут владеть одновременно только токенами одного ранга. Всеми остальными токенами владеет контракт SplitMerge. Если пользователь владеет токеном Упаковки, то все остальные токены, включённые в эту упаковку принадлежат контракту SplitMerge.

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

Сценарий 1: Создание SPACE токена после создания заявки на Аукционе земли

  1. Контракт SpaceAuction вызывает метод MintSpace(geohash) после того, как был создан Аукцион на новый конкретный Земельный участок и все проверки были сделаны, где geohash - геохеш Земельного участка.

  2. Контракт SpaceToken создает токен SPACE с идентификатором geohash. Владельцем токена становится контракт SpaceAuction.

  3. После того, как SPACE был создан и его Владельцем стал контракт SpaceAuction, происходит выполнение контракта SpaceAuction для этого токена.

    Сценарий 2: Первичная продажа SPACE токена после того, как Пользователь выиграл Аукцион земли на конкретный участок

  4. После успешной продажи на Аукционе земли SPACE токена своему первому владельцу - SpaceAuction вызывает функцию transfer(winnerAdress, winningbet), где winnerAdress - адрес победителя аукциона, winningbet - ставка, которая победила.
  5. winningbet передается в FundRegistry.onTransferReputationWithinFund и будет использоваться как репутация SPACE токена или так называемый Залог в GALT токенах.
  6. Токен SPACE передается от адреса контракта SpaceAuction адресу Владельца земли и за него сделан залог в GALT токенах в размере цены его продажи или winningbet в контракте FundRegistry.

    Сценарий 3: Передача SPACE токена другому владельцу

  7. При передачи другому Владельцу вызывается transfer(newowneradress) или transferFrom, но последний аргумент winningbet не разрешено указывать, так как эту функцию вызывает не SpaceAuction, а текущий Владелец токена SPACE.
  8. Функция transfer или transferFrom инициирует функцию FundRegistry.onTransferReputationWithinFund, которая обеспечивает уменьшение Репутации бывшего владельца и увеличение Репутации нового Владельца.
  9. Таким образом при передачи SPACE токена так-же передается и его Репутация: у старого владельца отнимается, и начисляется новому владельцу.
  10. Сам Залог в токенах GALT не перемещается и остается и Фонда.

Сценарий 4: Создание уникальных участков

См. - Контракт SplitMerge.

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

Модификации

  • Добавлено поле daoRegistry и функция setDaoRegistry чтобы при совершении операций со SPACE токеном - производились соответствующие операции с залоченными токенами GALT за соответствующим SPACE токеном.
  • Функция transferFrom переопределена для добавления аргумента reputation, который можно указывать только при первичной продаже токенов чтобы зафиксировать c помощью контракта DaoRegistry сколько за этим SPACE токеном будет числиться репутации.

    Связи с другими контрактами

  • В контракте аукциона содержится логика для создания новых SPACE токенов и определения за ними базовой репутации - залоченных токенов
  • В контракте Reputation хранится количество GALT токенов, залоченных за SPACE токеном
  • В контракте управления высотами содержится информация о верхней и нижней границе, на которую имеет право владелец SPACE токена

Методы

Encode

Преобразовывает string геохеша в uint256.

Decode

Преобразовывает uint256 в string геохеша.

Особенности реализации на Solidity

Владелец Контракта

Владельцем контракта является GALT Project CORE Team.

Особенности реализации на TypeScript

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

Q: Каким образом можно будет пополнять залоченные токены GALT? Из какого контракта это будет происходить?

A: Должно производится из контракта Репутации.

Q: Каким образом и из какого контракта будут производится штрафы из баланса залоченных GALT токенов?

A: Должно быть описано отдельным функционалом в отдельном контракте Штрафа Репутации

results matching ""

    No results matching ""