## [Дока](https://docs.google.com/document/d/1LF19Nigidw9cbPTcO34JFsP-7VEzw9OkjmEMNHQHOVc/edit)
## На сегодня
- Отображать ошибки с code 99: на странице баланса в кефире
- Отображать ошибки с code 99: отображение в мод. окне при регистрации кошелька
## Заметки:
Пока забиваем на:
- Платим как раньше
- Не берём в рассчёт сценарии, когда нет кошелька (пока заткнуть каким-то сообщением)
- В том числе новую страницу кошелька и модалку с редиректом на неё
- Отказ от автоматической модерации
- Значит выставление на продажу как раньше
- Возможно выйдет реализовать коллбэк по продаже токена, чтобы на стороне кефира снимать его с продажи
- Стоит посмотреть, насколько легко создать новый тип транзакции "Импорт"
## Суть:
- Перевод операций с токенами на кефировский контракт
- Изменение схемы импорта/трансфера токенов
[//]: # (- Отдельная страница создания/просмотра кошелька)
[//]: # (- Двухшаговая оплата (холд средств, их перечисление по успешному коллбэку, отмена холда по неудачному))
## Блоки:
- Импорт
- продажа (выставление/снятие) - фронт
- продажа импортированных токенов (бэк)
- передача с кефира на пользователя (без операций продажи и тд, если пользователь захотел иметь токен и в блокчейне)
## Картина в целом (можно ориентироваться по задачам фронта/бэка):
- Откат - это:
- Снятие брони с токена (если есть)
- Снятие холда средств (если есть)
- Уведомление с ошибкой (при успешных операциях откат не требуется)
- Модалка про кошелёк
- Текст о необходимости завести кошелёк на кефире
- Кнопки "Создать" (редиректнет на страницу создания) и "Отмена" (скроет модалку)
- Импорт:
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`
### Хост банка/кошелька/платёжного сервиса: ???
Холд средств:
Откат холда:
Снятие средств: