Функционал SplitMerge - требования

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

Необходимо обеспечить механизм обьединения и разделения участков. Необходимо обеспечить механизм создания Земельных участков произвольной формы.

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

  • У пользователя должна быть возможность объединять и разделять Земельные участки, как в пределах одного разряда Геохеша, так и создавая Земельные участки произвольной формы.

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

Сценарий 1: Разделение Земельного участка

Пользователь А вводные:

Адрес пользователя Токен SPACE Репутация
0x477...b65 sezu01 500
  1. Пользователь А хочет разделить sezu01.
  2. Пользователь А вызывает метод AproveforToken() контракта Reputation, указывая аргументом токен sezu01, разрешая контракту SplitMerge распоряжаться Репутацией токена sezu01 в полном обьеме. Пользователь А вызывает метод Aprove() контракта SpaceToken и дает право контракту SplitMerge переводить токен sezu01.
  3. Вызывается метод splitSpace контракта SplitMerge с аргументом sezu01.
  4. SplitMerge вызывает метод Split контракта Land с аргументом sezu01.
  5. Split возвращает массив из 32 дочерних элементов sezu010, sezu011, sezu012 и т.д. основываясь на родительском sezu01.
  6. Контракт SplitMerge проверяет по каждому элементу массива существование SPACE токена. Если токена нет, то Контракт SplitMerge вызывает метод mint() контракт SpaceToken и создает соответствующие токены SPACE, владелец токенов - Контракт SplitMerge.
  7. SplitMerge разделяет Репутацию токена SPACE sezu01 на 32 части используя метод transferFromToken() контракта Reputation и начисляет на 32 созданных токена SPACE. Одновременно токен sezu01 забирает себе SplitMerge, а 32 токена SPACE SplitMerge передает Пользователю А.

Пользователь А после выполнения разделения Земельного участка:

Адрес пользователя Токен SPACE Репутация
0x477...b65 sezu010 15,625
0x477...b65 sezu011 15,625
0x477...b65 sezu012 15,625
0x477...b65 sezu013 15,625
0x477...b65 sezu014 15,625
0x477...b65 sezu015 15,625
0x477...b65 Остальные Space токены 406,25

Сценарий 2: Объединение Земельного участки

Пользователь Б вводные:

Адрес пользователя Земли (Space) Репутация
0x112...fc1 sezu0b0 15,625
0x112...fc1 sezu0b1 15,625
0x112...fc1 sezu0b2 15,625
0x112...fc1 sezu0b3 15,625
0x112...fc1 sezu0b4 15,625
0x112...fc1 sezu0b5 15,625
0x112...fc1 Остальные Space токены 406,25
  1. Пользователь Б хочет объединить свои участки sezu0b0, sezu0b1, sezu0b2 итд.
  2. Пользователь Б вызывает метод AproveforToken() контракта Reputation, указывая аргументом массив токенов, которые он хочет объединить, разрешая контракту SplitMerge распоряжаться Репутацией этих токенов в полном обьеме. Пользователь А вызывает метод Aprove() контракта SpaceToken и дает право контракту SplitMerge переводить токены sezu0b0, sezu0b1, sezu0b2 итд.
  3. Пользователь Б вызывает метод mergeSpaces контракта SplitMerge передавая список id SPACE токенов для объединения в виде строки с разделителем.
  4. SplitMerge вызывает метод Merge() контракта Land. В качестве аргументов указываются id SPACE токенов, которые он хочет обьединить. Метод Merge() в случае успеха возвращает геохеш родителя этих 32 участков. В нашем случае sezu0b.
  5. Контракт SplitMerge проверяет, что возвращенный геохеш родительского участка имеет токен SPACE и принадлежит SplitMerge. Если его не существует, то Контракт SplitMerge вызывает mint() контракта SpaceToken и создает токен, владелец SplitMerge.
  6. SplitMerge суммирует Репутацию 32 токенов sezu0b0, sezu0b1, sezu0b2 итд. и переносит ее при помощи метода transferFromToken() контракта Reputation на токен sezu0b. И одновременно SplitMerge передает токен sezu0b Пользователю Б. А токены sezu0b0, sezu0b1, sezu0b2 итд. контракт SplitMerge забирает себе.

Пользователь Б после выполнения обьединения:

Адрес пользователя Земли (Space) Репутация
0x112...fc1 sezu0b 500

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

  1. Владелец SPACE токенов может вызвать метод контракта SplitMerge CreateCustomPlot() и создать уникальный токен SPACE с уникальным идентификатором. Пользователь в качестве аргументов метода указывает геохеши точек границ уникального Земельного участка. Земельный участок имеет форму многоугольника. Каждая точка имеет разрядность 10-11 символов и является вершиной многоугольника. Например, были переданы следующие координаты треугольного участка: w24qgy48e, w24qgsqw3,w24qgumbk. Идентификатор SPACE токена уникального участка 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk. SPACE Владелец SPACE - токена 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk контракт SplitMerge.

В контракте SplitMerge добавляется запись в маппинг CustomPlotBorders, который содержит соответствие id уникального участка - координата вершины. Эти координаты вершин носят справочный характер.

Токен номер позиции координата вершины
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 1 w24qgy48e
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 2 w24qgsqw3
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 3 w24qgumbk

ВАЖНО! В текущей версии надо сделать так, чтобы координаты вершин задавались произвольно только в заявке в PlotManager! В случае создания Упаковки из своих геохешей координаты вершина должны определяться и перезаписываться исходя из геохешей, которые находятся в упаковке!

Пусть у пользователя есть 3 токена: w24qgv4 и w24qguf, w24qguc.

Токен Владелец
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk Контракт SplitMerge
w24qgv4 Пользователь
w24qguf Пользователь
w24qguc Пользователь
  1. Владелец SPACE токенов может вызвать метод контракта SplitMerge MergeCustomPlot() указать в качестве аргументов 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk и w24qguf. Можно указывать только один SPACE - токен, который нужно добавить в уникальный участок.

Метод создает к уникальному токену 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk маппинг - .

id уникального участка номер позиции id геохеша
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 1 w24qguf

Контракт записал маппинг.

Контракт SplitMerge переводит токен 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk пользователю, а токен и w24qguf переводит себе.

Токен Владелец
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk Пользователь
w24qguf Контракт SplitMerge

Контракт SplitMerge переносит Залог с w24qguf на 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk и происходит перераспределение Репутации.

  1. У пользователя есть токен w24qguc и он тоже хочет его добавить в маппинг и включить в 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk. Он вызывает метод AddToCustomPlot(), указывает в нем 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk и w24qguc, а так же соседний участок, который был внесен ранее - w24qguf.

Контракт проверяет, что 743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk принадлежит пользователю. Контракт проверяет, что w24qguc принадлежит пользователю и его нет в маппинге. Контракт проверяет, что w24qguf принадлежит SplitMerge, является соседним участком с w24qguc и есть в маппинге i743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk - <id стандартного токена с геохешем>.

Контракт добавляет в маппинг w24qguc.

Маппинг меняет вид на:

id уникального участка номер позиции id геохеша
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 1 w24qguf
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 2 w24qguc

Контракт забирает токен w24qg88 себе и становится его владельцем.

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

Контракт перераспределяет Залоги и Репутации.

  1. Аналогично добавляется токен w24qgv4.

Маппинг меняет вид на:

id уникального участка номер позиции id геохеша
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 1 w24qguf
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 2 w24qguc
743883bs7GEOw24qgy48hgdhhqgddqw663w24qgumbk 3 w24qgv4

464cfe7bfb

Общая идея в том, что геохеш можно добавить в упаковку только в том случае, если в упаковке уже есть соседний геохеш!

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

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

Сценарий 5: Добавление геохешей группой

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

Сценарий 6: Удаление геохешей группой

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

Сценарий 8: Отображение токенов земельных участков в веб приложении

  1. Пользователь заходит в меню Мои участки. Отображается следуюшая информация:
Поле Значение Источник
ID ID токена участка Контракт SpaceToken
Тип Геохеш / Упаковка Контракт SpaceToken
Геохеш Если ТИП = Геохеш, то отображается строка геохеша Контракт SpaceToken
Границы Если ТИП = Упаковка, то отображается список точек вершин участка Контракт SplitMerge
Площадь 100 м2 Рассчитвается в браузере

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

  1. Если конкретный участок не выбран - отображаются все участки по правилам, указанным выше.

Сценарий 9: Разбор токенов геохешей в веб приложении

  1. Пользователь рядом с каждой записью токена геохеша в меню Мои участки видит кнопку Разобрать.

  2. При нажатии на кнопку появляется окно с предупреждением. В нем отображается сообщение, что Геохеш <такой-то> будет разобран на 32 геохеша и отображается их список. Так же отображается на карте исходный Геохеш и 32 дочерних. Есть 2 кнопки: Подтвердить Отменить. Если нажато Подтвердить, то создается транзакция, которая вызывает метод контракта SplitMerge. Отмена - закрывает сообщение.

  3. Список обновляется.

Сценарий 10: Объединение токенов геохешей в веб приложении

  1. В меню Мои участки вверху отображается кнопка Собрать геохеш. При ее нажатии происходит проверка, можно ли обьединить геохеши, которые есть у пользователя. Проверка происходит в браузере. Если нельзя - сообщение "Вы не можете обьединить Ваши геохеши". Если обьединение возможно, то отображается Сообщение "Геохеши <список> будут обьединены в геохеш <геохеш>. При этом на карте разными цветами отображаются дочерние и родительский геохеш. Продолжить? И две кнопки "Подтвердить" и "Отмена". Если подтвердить, то создается транзакция, которая вызывает метод контракта SplitMerge. После этого список обновляется. Если Отмена, то сообщение закрывается.

Сценарий 11: Создание упаковки в веб приложении

  1. В меню Мои участки вверху отображается кнопка Создать участок.

  2. Пользователь нажимает кнопку. Появляется сообщение "Выберите геохеши для включения в участок" или "Выберите зону на карте".

  3. Пользователь выбирает Геохеши. Происходит проверка на клиенте, что они соседние и могут быть включены в упаковку.

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

  5. Есть 2 Кнопки - Подтвердить, Отменить.

  6. Если нажато Подтвердить - создается транзакция с методом контракта SplitMerge. Создается упаковка и в нее добавляется один геохеш.

  7. Появляется кнопка Добавить все геохеши в упаковку. Пользователь нажимает кнопку и появляется сообщение "В такую то упаковку с ID будут добавлены такие то геохеши. Подвердить? Если пользователь нажимает Подтвердить, то генерятся транзакции по включению геохешей в эту упаковку.ъ

  8. Важно! В этом случае координаты точек вершин определяются и записываются по тем геохешам, которые включены!

  9. Если пользователь нажал "Выберите зону на карте", у него отображаются поля для ввода вершин многоугольника, так как это происходит при создании заявки. После того, как Пользователь выбрад контур появляется кнопка "Проверить мои геохеши".

  10. Приложение определяется, какие из геохешей Пользователся входят в указанные границы. Все геохеши, которые входят в эти границы - добаавляютя в список. Дальше пользователь так же добавляет геохеши в упаковку, как это делается со списком.

Сценарий 12: Добавление геохешей в существующую упаковку

  1. В меню Мои участки рядом с каждым токеном Упаковки есть кнопка Добавить геохеш.

  2. Если пользователь нажал кнопку, то появляется сообщение "Выберите геохеши для добавления". Пользователь может из списка своих геохешей выбрать один или несколько. При этом упаковка и выбранные геохеши отображаются на карте. Есть 2 кнопки Подтвердить и Отмена. Если нажато подвердить, то создатся транзакция или серия транзакций по включению геохешей и вызова метода контракта SplitMerge.

  3. Важно! В этом случае координаты точек вершин определяются и записываются по тем геохешам, которые включены!

  4. Счетчик геохешей упаковки в контракте увеличивается.

Сценарий 13: Удаление геохешей из существующей упаковки

  1. В меню Мои участки рядом с каждым токеном Упаковки есть кнопка Разобрать участок.

  2. Если пользоваиель нажал кнопку появляется сообщение "Выберите геохеши, которые вы хотите убрать" и список геохешей упаковки. Пользователь выбирает один или несолько геохешей.

  3. На клиенте происходит проверка, что их можно убрать по принципу соседства. Они должны быть с краев. То есть у самых крайних 2 грани должны не иметь соседей в упаковке. Остальные выбранные должны с ними граничить.

  4. Если выбранный геохеш не может быть удален, то выдается сообщение.

  5. Есть кнопка выбрать все.

  6. Если пользователь нажал кнопку подвердить, то создается одна или несколько транзакций с вызовом метода контракта SplitMergе по удалению геохеша из упаковки.

  7. Если в Упаковке 0 токенов геохешей, то она уже не принадлежит пользователю и не отображается.

Сценарий 14: Отправка участка

  1. Рядом с каждым токеном отображается кнопка "Отправить".

  2. Если пользователь ее нажал, то выполняется создается транзакция с вызовом метода transfer.

  3. Список обновляется после ее выполнения и передачи токена.

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

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

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

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

Сейчас главный геохэш - это sezu, который является примерно 1/4 частью всего Бир Тавила. Он делится на 32 участка, каждый из которых в последствии делится еще на 32. В итоге выпущенных участков 1024.

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

Нужно сделать возможность упаковки большого количества токенов SPACE с id в виде геохешей в произвольный SPACE токен с отдельным видом id. Таким образом мы рещим проблемы с участками неправильной формы. Мы просто апроксимируем участок геохешами, создаем токен произвольного участки и прописываем маппинг нового произвольного участки и 10-30 геохешей. Дальше все операции по обьединение и разделению этого произвольного участка происходят с учетом записанного маппинга. Разделение и обьединение происходит так же через контракт SplitMerge.

results matching ""

    No results matching ""