Задача
В ранний период работы с криптоактивами пользователь был сам себе интегратором: отдельный кошелёк под каждую сеть, ручное обращение с адресами, memo и сетевыми комиссиями, сторонний обменник для конвертации и ещё один сервис, чтобы завести деньги с карты. На каждом стыке средства теряются: перевод без memo, адрес не той сети, обмен по курсу, который успел уйти.
PayRue сводил это в один продукт с единым аккаунтом, портфелем и историей операций. Сложность в том, что за экранами стоит регулируемая финансовая система. Баланс не может быть «примерно верным». Депозит, замеченный индексатором дважды, реорганизация блокчейна, задержавшийся webhook провайдера и повторный callback банка не имеют права изменить остаток второй раз. Вывод должен пройти проверку санкционных списков раньше, чем транзакция уйдёт в сеть. И всё это — на трёх клиентских приложениях, которые обязаны показывать одно и то же состояние.
Решение
Внутренний реестр как источник истины. Пользовательские балансы живут во внутреннем реестре, а блокчейн и внешние финансовые системы регулярно с ним сверяются. Критичные операции идемпотентны и имеют сквозной correlation ID, поэтому повторный запрос возвращает тот же результат и не создаёт второй проводки.
Блокчейн-адаптеры. Каждая сеть подключена собственным адаптером, скрывающим различия Bitcoin, Ethereum, Stellar и токен-протоколов от остальных сервисов. Адаптер выдаёт адреса, синхронизирует блоки, находит входящие транзакции и считает подтверждения. Он же готовит и отправляет в сеть исходящие, оценивает сетевую комиссию, обрабатывает реорганизации и повторные попытки, ведёт сверку и поддерживает memo и tag. Подключение новой сети не трогает KYC, портфель, уведомления и поддержку.
Депозиты. Индексатор замечает транзакцию, сервис определяет адрес и актив, проводит проверки риска и комплаенса, ждёт нужного числа подтверждений и зачисляет сумму в реестр. Пользователь получает уведомление, а средства при необходимости консолидируются в казначейский кошелёк. Дедупликация по хешу транзакции и индексу выхода защищает реестр от повторного начисления. Для сетей с memo и destination tag интерфейс показывает оба реквизита и предупреждает о последствиях перевода без них.
Выводы. Перед созданием операции сервис сверяет формат и сеть адреса, доступный баланс, минимальную сумму и лимиты аккаунта. Отдельно проверяются уровень KYC, санкционный и AML-риск, частота операций и аномальное поведение, второй фактор, комиссия сети и её текущее состояние. Дальше у операции понятный статус на каждом шаге: проверка, очередь, подпись, отправка в сеть, подтверждения. В конце она выполнена, отклонена или завершилась ошибкой. Крупные и рискованные выводы уходят в ручную очередь комплаенса, а не блокируются молча.
Ключи и казначейство. Работа с ключами отделена от пользовательского API: зашифрованное хранение, раздельные горячие и холодные кошельки, ограниченные права на подпись, несколько согласований для казначейских операций, белый список направлений, экстренная заморозка и аудит каждого запроса на подпись. Поддержка не видит приватные ключи и не может единолично инициировать перевод из казначейства.
Котировки и обмен. Котировки собираются из нескольких источников, торговые пары нормализуются, устаревшие и аномальные значения отбрасываются. Пользовательская цена считается с учётом комиссии и доступной ликвидности. Котировка выдаётся с ограниченным сроком действия и идентификатором для последующей сверки. Когда срок истекает, расчёт обновляется до подтверждения, и по мёртвой цене сделка не исполняется. Сервис исполнения подбирает ликвидность, контролирует проскальзывание, резервирует баланс и проводит атомарные операции по реестру.
Фиат в обе стороны. On-ramp связывает банковский или карточный платёж с покупкой актива: проверка юрисдикции и лимитов, крипто-котировка, создание платежа, 3DS или банковская авторизация, подтверждение поступления денег и только затем зачисление. Отклонённые, ожидающие, просроченные и отменённые платежи, а также чарджбэки обрабатываются явно, чтобы необеспеченный актив не попал на баланс. Off-ramp фиксирует котировку, резервирует актив, выполняет обмен и создаёт выплату после проверки комплаенса. Подсистема расчётов сверяет блокчейн, реестр, исполнение на бирже, банковскую выплату, комиссии и возвраты.
Комиссии и PROPEL. Модуль комиссий складывает сетевую комиссию, плату за перевод, комиссию обмена, фиатный сбор, спред, скидку за PROPEL и минимальный порог. Финальный расчёт пользователь видит до подтверждения. Конфигурация версионируется, чтобы операцию можно было воспроизвести после изменения тарифов, а правила бонусов и комиссий вынесены в настройки: маркетинг и финансы меняют программу без обновления мобильных приложений.
Комплаенс с человеком в контуре. Консоль объединяет пользователя, операции и доказательства риска: KYC, проверку по санкционным спискам и PEP, риск устройства и сессии, скрининг блокчейн-адресов. Там же мониторинг транзакций, правила по частоте операций, запросы источника средств и неизменяемый аудит. Модуль оценки риска не принимает необратимое решение по одному внешнему скорингу: оператор видит причины, исходные данные и историю пользователя.
Результат
Пользователь получил один аккаунт вместо связки из кошелька, обменника и платёжного сервиса: портфель с эквивалентом в фиате, доступным и заблокированным остатком и ожидающими подтверждениями; отправку и приём по QR с сохранением получателя в адресную книгу; конвертацию по зафиксированной котировке; покупку и продажу за фиат; единую историю, где блокчейн-, обменные и фиатные операции лежат рядом с хешем, комиссией, курсом и хронологией статусов.
Операционная команда получила свои рабочие инструменты: консоль комплаенса с очередями и решениями, казначейскую и административную панели. Казначейская панель показывает горячие и холодные балансы, очередь подписей, нехватку валюты для сетевых комиссий, расхождения блокчейна и реестра и состояние провайдеров. В административной панели есть блокировка сессии, заморозка операции и полный аудит изменений.
Публичные материалы кампании 2019 года сообщали о более чем 22 000 зарегистрированных пользователях и более чем 4 500 аккаунтах, прошедших KYC, при работающих приложениях Web, iOS и Android.