## [Дока](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` ### Хост банка/кошелька/платёжного сервиса: ??? Холд средств: Откат холда: Снятие средств: