Единственное, что двигает деньги на платформе.
Балансы двойной записи на выделенном реестре, доступ только через типизированные команды, семантика exactly-once и явное состояние для случая, когда ответ так и не пришёл.
Кошелёк, если точно
Только типизированные команды
Депозит, резерв/сеттлмент/отмена/откат ставки, резерв/завершение/отмена выплаты. Универсального перевода и эндпоинта «установить баланс» нет.
Ниже нуля не уходит
Инструкцию, уводящую баланс в минус, отклоняет сам реестр, а не слой валидации, который кто-то может обойти.
Ровно один раз
Детерминированные идентификаторы и воспроизведение по точной квитанции: ретрай, обрыв связи или двойной клик не могут провести операцию дважды.
Неопределённость — это состояние
Если вызов не вернул терминального результата, операция не зафиксирована и не отклонена. Ограждённый reconciler разрешает её только по точному доказательству.
Холды
Зарезервированные деньги считаются недоступными, поэтому баланс нельзя потратить, пока выплата против него ещё в полёте.
Бонусные карманы
Бонусные обязательства лежат в своём семействе счетов и двигаются только командами начисления, конвертации или сгорания.
Каждый модуль на этой платформе определяется не только тем, чем владеет, но и тем, что ему запрещено. Именно это делает границу проверяемой, а не декларативной.
Все остальные модули платформы планируют эффект. Выполняет его только кошелёк.
Посмотрите, как это работает
Каждый модуль здесь превращается в экраны, которыми оператор пользуется в понедельник. Попросите разбор тех, что решают вашу неделю.