---
# System prepended metadata

title: Kefir ТЗ
tags: [ТЗ]

---

## [Дока](https://docs.google.com/document/d/1LF19Nigidw9cbPTcO34JFsP-7VEzw9OkjmEMNHQHOVc/edit)

## На сегодня
- Отображать ошибки с code 99: на странице баланса в кефире
- Отображать ошибки с code 99: отображение в мод. окне при регистрации кошелька

## Заметки:

Пока забиваем на:
  - Платим как раньше
  - Не берём в рассчёт сценарии, когда нет кошелька (пока заткнуть каким-то сообщением)
    - В том числе новую страницу кошелька и модалку с редиректом на неё
  - Отказ от автоматической модерации
    - Значит выставление на продажу как раньше 


- Возможно выйдет реализовать коллбэк по продаже токена, чтобы на стороне кефира снимать его с продажи
- Стоит посмотреть, насколько легко создать новый тип транзакции "Импорт"

## Суть:

- Перевод операций с токенами на кефировский контракт
- Изменение схемы импорта/трансфера токенов
[//]: # (- Отдельная страница создания/просмотра кошелька)
[//]: # (- Двухшаговая оплата &#40;холд средств, их перечисление по успешному коллбэку, отмена холда по неудачному&#41;)

## Блоки:

- Импорт
- продажа (выставление/снятие) - фронт
- продажа импортированных токенов (бэк)
- передача с кефира на пользователя (без операций продажи и тд, если пользователь захотел иметь токен и в блокчейне)

## Картина в целом (можно ориентироваться по задачам фронта/бэка):

- Откат - это:
  - Снятие брони с токена (если есть)
  - Снятие холда средств (если есть)
  - Уведомление с ошибкой (при успешных операциях откат не требуется)
- Модалка про кошелёк
  - Текст о необходимости завести кошелёк на кефире
  - Кнопки "Создать" (редиректнет на страницу создания) и "Отмена" (скроет модалку)


- Импорт:
  1) Если есть кошелёк на кефире:
     - Список токенов выпадает по старой схеме
     - По нажатию "Продать на кефире" толкаем с фронта метамаск `setApprovalForAll`, при неудаче - отображаем ошибку
     - Открывается окно выставления цены в рублях для токена
     - Выставляем, толкаем `createMarketItem` контракта "с фиксированной ценой в matic" (пока "1")
     - Отправляем на бэк, а он такой:
       - Запустили импорт (токен выставлен на продажу, модерирован, с соответствующей ценой)
       - Сразу добавляем соответствующие транзакции токену (мб такое уже есть)
       - Неудача - отсылаем на фронт ошибку, успех - редирект на страницу токена
  2) Если кошелька на кефире нет:
     - Список токенов выпадает по старой схеме
     - По нажатию "Продать на кефире" показываем "модалку про кошелёк"

- Выгрузка/синхронизация (новая функция):
  - Перенос токена с кошелька кефира на кошелёк пользователя, если токен хранится на кефире и принадлежит пользователю

- Выставление на продажу:
  - Если нет кошелька - "модалка про кошелёк"
  - Если у токена есть адрес коллекции в блокчейн - дёргаем `setApprovalForAll` (Разрешение на любые действия над токенами для кефира) метамаска
  - По подтверждению со стороны метамаска - дёргаем контракт кефира `createMarketItem`
  - Толкаем бэк

- Покупка/Продажа:
  - Предложение авторизоваться в метамаск (если не авторизован), для трансфера токена на блокчейне
  - Толкаем бэк (с адресом кошелька, если пользователь авторизован в метамаск):
    - Проверка возможности покупки `getPurchaseStatus` контракта:
      - Невозможна - снимаем с продажи, отправляем уведомление на фронт
    1) 2х факторный платёж (с холдом): 
        - Продажа токена (холдить средства покупателя бэка)
        - Бронируем токен
        - Запускаем `/marketplace/purchase` контракта
          - Успех - списание холдированных средств
          - Неудача - откат
        - Смена владельца токена (Если пользователь авторизован в метамаск, трансферить токен на его кошелёк)
        - Снятие блока токена, снятие токена с продажи
        - Возврат успеха/ошибки фронту
    2) Платёж по старой схеме:
        - Продажа токена 
        - Запускаем `/marketplace/purchase` контракта (сохраняем где-то адрес кошелька с фронта)
        - Успех - Бронируем токен
        - Отсылаем фронту статус
        - 
        - По коллбэку - смена владельца токена, снятие блока

- Изменение цены (на потом):
  - `updateMarketItemPrice` контракта

- Снятие с продажи:
  - `removeMarketItem` контракта


## Задачи:

### Фронт:

- Модалка про кошелёк

- Отдельная страница кошелька:
  - Есть - показ баланса и мб списка операций
  - Нет - форма создания кошелька

- Алерт с сообщением об ошибке (много случаев, в котором может вылезти)

- По неудаче с запросами к metamask/контракту кефира, если уже были совершены какие-то действия на бэке:
  - отобразить ошибку на фронте
  - толкнуть метод отката бэка

- Взаимодействие с metamask:
  - `setApprovalForAll`

- Взаимодействие с контрактом кефира:
  - `createMarketItem`

- Импорт:
  - Список токенов отображается по старой схеме
  - Сменить надпись на кнопке импорт (вкладка "Владею в Polygon") на "Продать на кефире"
  - По нажатию - проверяем наличие кошелька на кефире
  - Успех - толкаем метамаск `setApprovalForAll`
  - Успех - окно выставления цены в рублях для токена
  - Отправка на бэк инфы по токену вместе с ценой:
    - Успех - редирект на страницу токена (ссылка придёт с бэка)
    - Неудача - отображение ошибки

- Выставление на продажу:
  - Проверка наличия кошелька на кефире (см "модалка про кошелёк")
  - Предложение авторизоваться в метамаск (если не авторизован)
  - Если у токена есть адрес коллекции в блокчейн - дёргаем `setApprovalForAll` метамаска
  - Показать окно выставления цены
  - Толкаем бэк с ценой и адресом кошелька из метамаска (если пользоавтель авторизовался):
    - `getPurchaseStatus` контракта
    - Выставить токен на продажу
    - Отправить статус на фронт
  - Фронт:
    - Контракт кефира `createMarketItem`
      - Успех - обновление страницы
      - Неудача - толкаем "откат" на бэке

- Синхронизация (если пользователь владеет токеном на кефире, но токен всё ещё лежит на кошельке кефира):
  - Кнопка на странице токена (рядом с выгрузкой) толкает бэк
  - С бэк приходит успех/неудача
  - Сообщаем при успехе, показываем ошибку при неудаче

- Изменение цены
  - Толкаем бэк
  - Обновляем при успехе, показываем ошибку при неудаче

- Снятие с продажи
  - Толкаем бэк
  - Обновляем при успехе, показываем ошибку при неудаче 


### Бэк:

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

- Сервис для взаимодействия с контрактом кефира:
  - Получение адреса контракта: GET `api/marketplace/contract`
  - Синхронизация - `changeOwner` для перевода с кошелька кефира на кошелёк владельца токена
  - Проверить статус, можем ли купить:  GET `/api/marketplace/getPurchaseStatus`
  - Купить за рубли (с кошельком и без): PUT `/api/marketplace/purchase`
  - `updateMarketItemPrice`
  - `removeMarketItem`

- Импорт:
  - Действует старая схема - при отсутствии, создаётся новая коллекция для токена
  - Автоматическая модерация
  - Добаление соответствующих транзакций
  - Выставление цены (с возвра)
  - Возврат успеха (с юрлом на страницу токена) и неудачи (с сообщением об ошибке)

- Выставление на продажу (к примеру уже существующего на кефире токена):
  - Проверка возможности выставить на продажу (наличие ЭК/привязка к СБП/регистрация ЮЛ, проверка через контракт - не продан ли уже токен)

## Запросы:

### Хост контракта: blockchain.kefirium.ru

Получение адреса контракта: GET `api/marketplace/contract`

Проверить статус, можем ли купить:  GET `/api/marketplace/getPurchaseStatus`
Купить за рубли (с кошельком и без): PUT `/api/marketplace/purchase`

Изменить владельца токена: PUT `/api/marketplace/changeOwner`

### Хост банка/кошелька/платёжного сервиса: ???

Холд средств:

Откат холда:

Снятие средств:

