Техническое задание на заявки на покупку карт
Статус: бизнес-правила согласованы; готово к техническому проектированию.
Дата: 2026-11-07.
Рабочее название раздела: «Брони».
Цель
Пользователь заранее указывает цену, которую готов заплатить за определённую
карту, и обеспечивает заявку деньгами на своём балансе. Заявка автоматически
покупает подходящую карту на маркете или участвует в её аукционе.
Публичные предложения анонимны. Новый механизм отличается от существующего
кратковременного резерва конкретного экземпляра на маркете.
В объём входят новая вкладка, обеспеченные заявки с частичным исполнением,
автоматические покупки и ставки, связь с ручными покупками, а также переход
новых аукционов на распределение цены 85/15.
Согласованные правила
Раздел и поиск
- Рядом с «Маркет» и «Аукционы» появляется раздел «Брони».
- Начальный экран пока пустой. Каталог или подборки при открытии не выводятся.
- На нём доступны поиск и вход в «Мои брони». В «Моих бронях» видны ожидающие
копии, активные ставки, исполненная часть, отмены, история и связанные аукционы.
- Поиск работает по всему каталогу, включая карты, которых сейчас нет в продаже.
- Карточка открывает список предложений и размещение своей заявки.
- Суммы предложений видны без имён и других идентификаторов участников.
- Приоритет исполнения — у большей цены; при одинаковой цене — у более ранней
заявки. Возвращение после перебивания на аукционе сохраняет первоначальное
место в очереди своей цены.
- При внесении карты со спросом отмечаются отдельно; показываются лучшая текущая
бронь и количество запрошенных копий. Это информация о текущем спросе,
а не гарантия итоговой цены. Мгновенная продажа в обход аукциона не предлагается.
- Доступный для нового лота спрос рассчитывается по ожидающим обеспеченным
копиям. Сумма, уже занятая в другом аукционе, не считается свободной бронью.
Деньги и покупка с маркета
- Заявки доступны для полных карт и осколков всех доступных для торговли рангов.
Оплата происходит в соответствующей валюте ранга; карта и осколок — разные
предметы заявки.
- В заявке можно указать количество копий. Замораживается цена за копию,
умноженная на количество. Допускается частичное исполнение.
- Отдельных бизнес-лимитов количества активных заявок и копий нет. Для всех
заказанных копий необходимо полное денежное обеспечение.
- Пример: 3 копии по 2S — удержание 6S. Каждая оплаченная копия уменьшает
оставшееся количество на одну.
- Цена заявки — верхняя граница автоматической покупки с маркета и
автоматической ставки. Ручное повышение сверх неё требует явного действия
пользователя и оплаты разницы.
- Если доступная карта стоит дешевле, покупка проходит по цене продавца.
- Пример: заявка 3S, доступная копия 2S — покупка за 2S, оставшийся 1S доступен
покупателю. Переплата продавцу до 3S не производится.
- До превращения в лидирующую аукционную ставку заявку можно отменить с полным
возвратом её оставшегося удержания.
- Ожидающую часть можно отменить независимо от активных ставок той же заявки.
Возвращаются деньги только за отменённые копии; лидирующие ставки сохраняются.
- Заявка бессрочна: действует до полного исполнения или отмены пользователем.
- Можно редактировать цену и оставшееся количество ожидающей части. Для
увеличения обеспечения требуется достаточный свободный баланс. Уже
лидирующие ставки при таком редактировании не меняются.
- Изменение цены или увеличение количества задаёт новое время приоритета
изменяемой ожидающей части. Уменьшение количества сохраняет её место в очереди.
- Изменения касаются только редактируемой части. Если из двух копий по 3A одна
уже участвует в аукционе, а цену ожидающей изменили на 4A, после перебивания
первой будут ожидать одна копия за 3A и одна за 4A. Части с разными ценами
и доступными действиями показываются отдельно в «Моих бронях».
- Ручная покупка нужной карты с маркета засчитывается в ожидающую бронь:
её оставшееся количество уменьшается на одну копию, а замороженные средства
можно использовать для оплаты. Купленная копия не должна затем приобретаться
повторно через сохранившуюся заявку.
- Для ручной покупки используется только ожидающая часть. Средства и копии,
уже занятые в других аукционах, не освобождаются для неё автоматически.
- В интерфейсе доступна история действий. Telegram-уведомления отправляются
только об успешной покупке и о проблемах, требующих действий пользователя;
обычное перебивание ставки само по себе таким событием не является.
- Замороженные деньги продолжают учитываться в стейке и распределении дохода,
как действующие аукционные удержания.
Выбор подходящего предложения
Сначала бронь покупает самую дешёвую доступную копию на маркете, цена которой
не превышает её лимит. В поиске участвуют как банковские лоты, так и
пользовательские лоты «по своей цене».
Если подходящей копии на маркете нет, выбирается подходящий аукцион с ближайшим
окончанием. При этом цена заявки должна удовлетворять минимуму и шагу ставки.
Комплекты карт целиком бронями не покупаются: единица исполнения — конкретная
полная карта или осколок нужного каталожного вида.
Чужой кратковременный резерв и удержания для вывода, ковки, розыгрыша или другой
внешней операции не обходятся. Пока экземпляр недоступен по действующим
правилам, бронь не может его купить. После освобождения он снова рассматривается
на обычных условиях.
Права и анонимность
Для броней используются действующие права покупки и участия в аукционах.
Автоматическое исполнение не даёт пользователю дополнительных прав по сравнению
с соответствующим действием вручную.
Авторы чужих заявок скрыты от пользователей. Уполномоченные администраторы видят
автора и историю для разбора операций; административные сведения не попадают
в публичные ответы или события обновления.
Бронь не покупает собственный текущий лот пользователя. После продажи карты
банку бронь бывшего владельца может участвовать в её выкупе, если это разрешено
действующими правилами торгов. Нового запрета на такие бывшие карты не вводится.
Если торговлю картой запретили или пользователь полностью потерял право
торговать, ожидающая часть соответствующих броней отменяется с возвратом денег
и уведомлением пользователя. Уже активные ставки обрабатываются по действующим
правилам аукциона. Вернувшаяся из такого аукциона копия также должна пройти
проверку прав: при сохраняющемся запрете деньги освобождаются, бронь не оживает.
Участие в аукционе
- Новая карта сначала проходит аукцион. Мгновенная продажа при внесении в обход
аукциона не предусматривается.
- Наибольшая подходящая заявка становится первой оплаченной ставкой и задаёт
стартовую цену аукциона.
- Заявку разрешается создать ниже текущего минимума аукциона, но она не снижает
его минимум и не участвует, пока её цены недостаточно. Такая заявка может
дождаться подходящей покупки на маркете.
- Если эту ставку не перебили, автор заявки автоматически выигрывает карту.
- Заявка участвует и в уже идущем аукционе, если её цена достаточна с учётом шага
ставки. Например, при текущей ставке 2S заявка 3S может поставить 3S.
- Лидирующую ставку, созданную заявкой, отменить нельзя.
- Если ставку перебили, заявка возвращается в ожидание следующей копии. Её деньги
остаются замороженными; нового списания с доступного баланса нет.
- Средства одной заказанной копии могут обеспечивать только один аукцион
одновременно. Одновременное поступление двух подходящих карт не позволяет
использовать одно удержание для двух ставок.
- Заявка на несколько копий может участвовать в нескольких аукционах: максимум
по одному на каждую обеспеченную копию. Например, 2 копии по 3A с удержанием 6A
могут одновременно лидировать в двух аукционах. Каждая победа исполняет одну
копию, а не всю многокопийную заявку.
- Аукцион без ставок по-прежнему выпускает карту на маркет. При появлении
подходящей цены ожидающая бронь может купить её с маркета.
- При технической отмене аукциона связанная копия возвращается в очередь
по своей исходной цене, ручная доплата освобождается. Перезапуск аукциона
не дублирует прежнюю ставку или её обеспечение. Если торги запрещены,
применяется описанный выше возврат денег вместо повторного участия.
Ручная ставка с использованием брони
Пользователь может продолжить торги вручную, используя деньги своей брони.
При этом уже обеспеченная сумма учитывается в ставке и не удерживается повторно.
Обязательный сценарий владельца:
- У пользователя всего 4A: 3A заморожены в брони, 1A доступен.
- Бронь становится первой ставкой 3A.
- Другой участник ставит 3.5A; бронь первого пользователя возвращается в ожидание.
- Первый пользователь вручную ставит 4A. Для этой ставки используются 3A
существующей брони и 1A свободного остатка. Дополнительные свободные 4A не нужны.
- При победе списываются ровно 4A. Соответствующее обязательство по покупке
исполнено; бронь не должна затем купить лишнюю копию.
Если ручную ставку 4A перебили, возвращается исходная заявка на 3A, а добавленный
1A освобождается. Ручное повышение в конкретном аукционе не меняет цену самой
заявки. Для заявки на несколько копий ручная победа исполняет одну из них.
Ожидаемые остатки в обязательном сценарии, в валюте A:
| Событие |
Доступно |
Удержание ожидающей брони |
Удержание ставки |
| До размещения |
4 |
0 |
0 |
| Создана бронь 3A |
1 |
3 |
0 |
| Бронь стала ставкой |
1 |
0 |
3 |
| Другой участник поставил 3.5A |
1 |
3 |
0 |
| Автор брони поставил 4A вручную |
0 |
0 |
4 |
| Победа за 4A, карта получена |
0 |
0 |
0 |
| Вместо победы ставку 4A перебили |
1 |
3 |
0 |
Две последние строки — альтернативные исходы. Перенос денег между удержаниями
не является новым списанием и не меняет общий денежный остаток пользователя.
Экономика продаж и переход на новые правила
- Для всех новых аукционов, независимо от наличия заявки, итоговая цена делится:
85% продавцу и 15% в доход банка для распределения.
- Это относится и к новым аукционам комплектов, хотя брони отдельных карт
не исполняются покупкой комплекта.
- Пример: итоговая цена 3S — продавцу всего 2.55S, на распределение 0.45S.
- Если бронь 3S перебили и аукцион завершился за 4S, продавцу всего 3.4S,
на распределение 0.6S.
- Базовое начисление при внесении сохраняется. После продажи продавец получает
доплату до итоговых 85%, а не ещё 85% поверх уже выплаченного.
- Уже выплаченное не отбирается, если карта подешевела. В таком случае доплата
равна нулю, разницу покрывает банк; 15% от цены продажи всё равно направляются
на распределение.
- Если продавцом является сам банк, например для собственных результатов ковки
и DROP, 85% остаются банку, а 15% идут на распределение пользователям.
- При покупке с маркета по заявке также применяется 85/15. Обычные рыночные
покупки без заявки сохраняют текущую экономику.
- Ручная покупка, засчитанная в бронь и оплаченная с использованием её
обеспечения, является покупкой по заявке. Наличие кнопки ручной покупки
не создаёт вторую независимую продажу или второе списание.
- Сумма 15% распределяется по существующей формуле распределения банковского
дохода; равного деления между всеми пользователями не вводится.
- Новое правило заменяет прежнюю формулу аукционной доплаты для соответствующих
продаж.
- Уже созданные на момент выпуска аукционы сохраняют прежнюю экономику до
завершения. Новые аукционы получают 85/15, даже если сама карта внесена раньше.
Завершённые продажи и выплаты не пересчитываются.
Для пользовательского лота с ценой продажи P и уже выплаченным начислением A:
- доплата продавцу:
max(0, 0.85 × P − A);
- общий доход продавца за карту:
max(A, 0.85 × P);
- сумма на распределение:
0.15 × P;
- возмещение банку ранее выданного начисления из этой продажи:
min(A, 0.85 × P);
- невозмещённая часть начисления, которую несёт банк:
max(0, A − 0.85 × P).
Доплата, сумма на распределение и возмещение банку в сумме равны P.
Пример снижения цены: ранее начислено 2A, продажа за 2A — продавцу ничего
дополнительно не начисляется и не списывается, 0.3A распределяются, 1.7A
возмещаются банку, а 0.3A ранее выданного начисления остаются расходом банка.
A — фактически начисленная сумма за эту конкретную копию в текущем цикле
продажи, а не цена, пересчитанная по сегодняшнему коэффициенту. Выплаты прежним
владельцам в прошлых циклах сюда не включаются. Получатель доплаты и сумма
предыдущего начисления должны быть сохранены и однозначно связаны с продажей.
Для пользовательского поступления используется его реальный вноситель/продавец;
техническая передача карты на банковский аккаунт не теряет эту связь.
Жизненный цикл одной заказанной копии
[Diagram]
Возврат из аукциона допускается только при сохранённых правах на торговлю;
иначе копия отменяется с освобождением денег. Состояния относятся к одной
заказанной копии: в многокопийной заявке одновременно могут быть ожидающая,
аукционная и исполненная части.
Обязательные проверки
- Ручная ставка 4A при общем балансе 4A и существующей брони 3A: сумма брони
засчитывается в оплату ставки. Победа исполняет бронь без двойного списания
и без последующей покупки лишней копии.
- Два подходящих аукциона создаются одновременно при брони одной копии на 3A:
только один получает ставку этой брони; удержание не используется дважды.
- Бронь двух копий по 3A с обеспечением 6A может участвовать в двух аукционах;
третья одновременная ставка из этих же средств невозможна.
- После перебивания ручной ставки 4A исходная бронь восстанавливается на 3A,
дополнительный 1A освобождается ровно один раз.
- Покупка за 2S при лимите 3S: с покупателя списывается цена 2S, разница 1S
освобождается, купленное количество учитывается один раз.
- Частичное исполнение 3 копий по лимиту 3S: покупки за 2S и 2.5S расходуют
4.5S, освобождают 1.5S, а для последней копии остаётся ровно 3S обеспечения.
- Ручная покупка с маркета с использованием обеспечения брони исполняет одну
копию заявки. Одновременная автоматическая обработка не покупает эту копию
второй раз и не использует то же обеспечение повторно.
- Изменение цены и увеличение ожидающего количества обновляют приоритет;
уменьшение количества и возврат после перебивания сохраняют его.
- Редактирование ожидающей части с 3A до 4A не меняет цену копии, уже
участвующей в аукционе. После перебивания эта копия возвращается с 3A,
дополнительный 1A для неё не запрашивается и не списывается.
- При наличии подходящих лотов выбирается самый дешёвый, включая «свою цену»;
аукцион выбирается лишь при отсутствии подходящего рыночного лота, по
ближайшему сроку окончания. Бандлы не участвуют в сопоставлении броней.
- Среди подходящих броней исполняется наибольшая цена, при равенстве — более
ранний приоритет. Недостаточная для минимума или шага ставка пропускается;
автоматическое исполнение никогда не превышает цену брони.
- Полная карта и осколок с одним каталожным ID не подменяют друг друга;
обеспечение и расчёт остаются в соответствующей валюте.
- Перебивание автоматической ставки возвращает заявку в очередь с прежним
обеспечением без повторного списания с доступного баланса.
- Новая аукционная продажа за 3S при ранее выданном начислении 1.6S:
доплата продавцу 0.95S, общий доход продавца 2.55S, на распределение 0.45S,
возмещение банку 1.6S. Сумма новых денежных движений равна оплате покупателя.
- Продажа за 2A при ранее выданном начислении 2A: доплата 0, из кошелька
продавца ничего не списывается, на распределение 0.3A, возмещение банку 1.7A.
- Повтор завершения покупки, повтор запроса пользователя и повтор обработки
фонового задания не создают второй покупки, выплаты или возврата удержания.
- Одновременная отмена ожидающей копии и назначение её аукциону дают только один
результат: либо деньги возвращены и ставки нет, либо ставка принята и её
удержание нельзя отменить.
- Одновременные ручная ставка и автоматическое назначение той же суммы другому
аукциону не используют деньги дважды. Деньги, уже обеспечивающие другую
лидирующую ставку, не считаются доступными для ручного повышения.
- Уже созданный до выпуска аукцион завершается по своей старой формуле;
аукцион, созданный после выпуска, использует 85/15.
- Банковская карта из ковки/DROP направляет 85% банку и 15% на распределение.
Новый аукцион комплекта использует 85/15, но не расходует брони его карт.
- Обычная рыночная покупка без связанной брони сохраняет прежнюю экономику;
покупка с использованием брони использует новый расчёт.
- Отмена ожидающей части возвращает только её деньги; активные ставки
сохраняются. Техническая отмена аукциона возвращает исходную бронь и отдельно
освобождает ручную доплату.
- Запрет торгов картой или полная потеря прав отменяет ожидающую часть с
однократным возвратом. Поздний результат старого задания не восстанавливает
отменённую бронь. Проверка прав действует и при возврате из аукциона.
- Чужой резерв, вывод, ковка и розыгрыш исключают удержанный экземпляр из
покупки. Свой текущий лот не выкупается; бывшая карта, проданная банку,
допускается только по действующим правилам торгов.
- Удержание брони не уменьшает стейк пользователя. Публичные ответы и события
не содержат чужую личность; административное чтение доступно только
уполномоченным ролям.
Требования к реализации денежных операций
Каждая заказанная копия находится ровно в одном состоянии: ожидает исполнения,
обеспечивает один конкретный аукцион, куплена или отменена. Частичное исполнение
одной заявки не расходует обеспечение её остальных копий.
Переход между ожидающей бронью и ставкой сохраняет связь с исходной заявкой.
Ручная ставка также сохраняет эту связь, если использовала её обеспечение.
Результат аукциона поэтому однозначно определяет, какую копию исполнить или
вернуть в очередь и какую ручную доплату освободить.
Движения кошелька, изменение удержания, количество оставшихся копий, приобретение
экземпляра и основание будущего распределения дохода фиксируются согласованно.
При повторе команды возвращается уже сохранённый результат. Незавершённая
операция не должна терять деньги при перезапуске процесса.
Денежные суммы рассчитываются точным десятичным типом с существующей точностью
финансового учёта. Округление отображения не должно менять удержание, цену,
комиссию или выплату. В записи продажи сохраняются её правила расчёта, цена,
предыдущее начисление, доплата, сумма на распределение и связи с бронью/аукционом.
Повтор расчёта использует эти сохранённые значения.
Конкурентные сценарии проверяются на изолированном PostgreSQL с настоящими
транзакциями и управляемыми одновременными запросами. Денежные примеры должны
сверяться по кошелькам, удержаниям и журналу, а не только по HTTP-ответу.
Внешние операции Senkuro для этих проверок подменяются; живая ковка не нужна.
Публичные ответы API и события обновления не раскрывают автора чужой заявки.
Анонимность должна обеспечиваться сервером, а не только скрытием имени
в интерфейсе.
Текущая основа проекта
Следующий этап — технический план: схема заявок и обеспечения каждой копии,
связь с аукционами и покупками, версия расчёта выплат, API, фоновое исполнение,
интерфейс и последовательность выпуска. Настоящее ТЗ определяет поведение
и критерии приёмки; реализация и изменения рабочих окружений в эту стадию не входят.