Перейти к содержанию

Вывод средств

В данном разделе описан полный процесс вывода криптовалюты: от запроса пользователя до подтверждения транзакции в блокчейне.

Поддерживаемые сети

Сеть Сервис отправки транзакций
Bitcoin (BTC) TxProcessor BTC
EVM-совместимые (ETH, BSC и др.) TxProcessor EVM
TRON (TRX, TRC20) TxProcessor TRON

Шаги процесса

  1. Пользователь отправляет запрос на вывод через Gateway (asset, network, amount, address).
  2. Gateway проксирует запрос в Ledger, который создаёт запись о выводе и отслеживает его статус.
  3. Ledger вызывает ExchangeIntegration.WithdrawToBlockchain.
  4. ExchangeIntegration проксирует запрос в Exchange Admin.WithdrawToBlockchain.
  5. Admin-сервис выполняет валидацию:
    • Проверка достаточности баланса на FUNDING-счёте.
    • Проверка лимитов вывода (дневной/единовременный лимит).
    • Проверка адреса получателя по чёрному списку.
    • AML-проверка: вызов Elliptic API для оценки риска адреса получателя (CheckWallet). Если risk score превышает порог по категориям — вывод блокируется, адрес добавляется в blacklist на 24 часа.
  6. Сумма вывода + комиссия списываются с FUNDING-баланса пользователя.
  7. Создаётся запись Tx со статусом PENDING.
  8. Создаётся TxBatch со статусом need_send.
  9. Ledger обновляет статус записи о выводе.
  10. TxProcessor (соответствующий сети) подхватывает батч:
    • BTC: выбирает UTXOs, формирует транзакцию, подписывает, отправляет в сеть.
    • EVM: формирует транзакцию, оценивает gas, подписывает, отправляет.
    • TRON: формирует TRC20-трансфер, подписывает, отправляет.
  11. TxBatch переходит в статус pending (ожидание подтверждений).
  12. TxProcessor отслеживает появление транзакции в блоке.
  13. После подтверждения: статус → success, сохраняется tx_hash.

Диаграмма: Процесс вывода

sequenceDiagram
    actor U as Пользователь
    participant GW as Gateway
    participant LED as Ledger
    participant EI as ExchangeIntegration
    participant EA as Exchange Admin
    participant AML as Elliptic (AML)
    participant TXP as TxProcessor
    participant BC as Блокчейн

    U->>GW: POST /withdrawal\n(asset, network, amount, address)
    GW->>LED: WithdrawRequest(user_id, asset, network, amount, address)
    LED->>LED: Создать запись вывода [PENDING]
    LED->>EI: WithdrawToBlockchain(user_id, ...)
    EI->>EA: WithdrawToBlockchain(account_id, ...)

    EA->>EA: Проверка баланса FUNDING
    EA->>EA: Проверка лимитов вывода
    EA->>EA: Проверка адреса по blacklist

    EA->>AML: CheckWallet(address)\nОценка риска адреса получателя
    AML-->>EA: risk_score + категории

    alt AML: адрес грязный (risk > threshold)
        EA->>EA: Добавить адрес в blacklist (24h)
        EA-->>EI: Отказ: AML risk
        EI-->>LED: Ошибка
        LED->>LED: Обновить статус -> FAILED
        LED-->>GW: Ошибка
        GW-->>U: Отказ: адрес не прошёл AML-проверку
    else AML: адрес не найден в базе Elliptic
        EA-->>EI: Отказ: адрес не найден в AML
        EI-->>LED: Ошибка
        LED->>LED: Обновить статус -> FAILED
        LED-->>GW: Ошибка
        GW-->>U: Отказ: адрес не прошёл AML-проверку
    else Валидация не пройдена (баланс / лимит / blacklist)
        EA-->>EI: Ошибка
        EI-->>LED: Ошибка
        LED->>LED: Обновить статус -> FAILED
        LED-->>GW: Ошибка
        GW-->>U: Отказ с причиной
    else Все проверки пройдены
        EA->>EA: Списать (amount + commission) с FUNDING баланса
        EA->>EA: Создать Tx [PENDING]
        EA->>EA: Создать TxBatch [need_send]
        EA-->>EI: OK, withdrawal_id
        EI-->>LED: OK
        LED->>LED: Обновить статус -> PROCESSING
        LED-->>GW: OK
        GW-->>U: Заявка принята

        TXP->>EA: Получить TxBatch [need_send]
        EA-->>TXP: Список транзакций

        alt Сеть: BTC
            TXP->>TXP: Выбор UTXOs
            TXP->>TXP: Формирование и подпись транзакции
        else Сеть: EVM
            TXP->>TXP: Формирование транзакции
            TXP->>BC: Оценка gas (eth_estimateGas)
            TXP->>TXP: Подпись транзакции
        else Сеть: TRON
            TXP->>TXP: Формирование TRC20 трансфера
            TXP->>TXP: Подпись транзакции
        end

        TXP->>BC: Broadcast транзакции
        BC-->>TXP: tx_hash
        TXP->>EA: Обновить TxBatch -> [pending], сохранить tx_hash

        loop Мониторинг подтверждений
            TXP->>BC: Проверка статуса транзакции
        end

        BC-->>TXP: Транзакция подтверждена
        TXP->>EA: Обновить Tx -> [success], tx_hash
        LED->>LED: Обновить статус -> SUCCESS
    end

Статусы транзакции (Tx / TxBatch)

Статус Описание
PENDING Заявка принята, ожидает обработки
need_send Батч сформирован, ожидает отправки TxProcessor
pending Транзакция отправлена в блокчейн, ожидает подтверждений
success Транзакция подтверждена в блокчейне
failed Ошибка при отправке или транзакция отклонена сетью

Особенности по сетям

Bitcoin (BTC)

  • TxProcessor выбирает оптимальный набор UTXO для покрытия суммы.
  • Комиссия рассчитывается на основе текущей комиссии за байт (fee rate) из мемпула.
  • Сдача (change) возвращается на горячий кошелёк биржи.

EVM-сети (ETH, BSC и др.)

  • Для ERC20-токенов вызывается метод transfer смарт-контракта.
  • Gas limit оценивается через eth_estimateGas с запасом.
  • Gas price берётся из eth_gasPrice или EIP-1559 (maxFeePerGas / maxPriorityFeePerGas).

TRON

  • TRC20-трансферы используют метод transfer контракта токена.
  • Энергия (Energy) и полоса пропускания (Bandwidth) учитываются при расчёте комиссии.

Ограничения и проверки

Проверка Описание
Минимальная сумма вывода Определяется конфигурацией для каждого актива и сети
Дневной лимит Максимальная сумма вывода за 24 часа
Чёрный список адресов Адреса из таблицы blacklist блокируются автоматически
AML-проверка (Elliptic) Адрес получателя проверяется через Elliptic CheckWallet. Risk score и категории сравниваются с порогами из таблицы risk_categories. Превышение — блокировка + запись в blacklist на 24 часа
Проверка баланса Вывод невозможен при недостаточном FUNDING-балансе

Связанные разделы