coinwingClosed beta Запросить доступ

Некастодиальный приём стейблкоинов

Депозиты в USDC, которые сервис не может потратить

Coinwing следит за EVM-сетями и сообщает вашему приложению о поступивших переводах подписанными вебхуками. На сервере лежит только xpub: он позволяет вывести адрес для платежа и не позволяет списать с него ни цента. Это свойство конструкции, а не настройка, которую можно случайно выключить.

Адрес m/44'/60'/0'/0/420x9858…4c1a выведен из xpub
Перевод 1 000 000 базовых единиц USDC · block 47 700 123 = 1.00 USDC
Финальность подтверждений 41 / до finalized обнаружен
Вебхук POST /coinwing/webhook200 OK подпись HMAC-SHA256

Вы кредитуете клиента на четвёртой строке — не раньше, чем сеть перестала иметь право передумать.

Как это работает

  1. 01

    Генерируете кошелёк офлайн

    Сид и приватные ключи не покидают вашу машину. Сервису вы отдаёте только xpub — xprv он отклоняет при сохранении.

  2. 02

    Просите адрес для счёта

    Один вызов API — один адрес, выведенный из вашего xpub для этого аккаунта. Повторный вызов возвращает тот же адрес.

  3. 03

    Клиент платит

    Каждую сеть смотрят несколько независимых источников. Их результаты объединяются, поэтому молчание или неполный ответ одного из них не прячет платёж.

  4. 04

    Приходит вебхук

    deposit.detected — показать «платёж получен, ждём сеть». deposit.confirmed — вот на нём зачисляете.

Почему так устроено

Списать нечем

Сервер провижинится только xpub аккаунта. Он умеет выводить адреса и не умеет подписывать транзакции — терять при взломе нечего.

Несколько глаз на сеть

Каждый проход сеть опрашивают несколько независимых провайдеров, а их ответы сливаются в одно событие. Здоровье каждого видно оператору.

Зачисление после финальности

Депозит подтверждается не выше finalized-блока, поэтому реорганизация сети не может отменить уже зачисленные деньги.

Только целые числа

Суммы — целые базовые единицы от чтения лога до передачи по сети (строками, потому что число в JSON — это double). Никакого округления.

Сразу в долларах

К каждому депозиту приложен курс: медиана трёх независимых источников, зафиксированная в момент обнаружения. Курса не нашлось — придёт null, а не ноль.

Повтор безопасен

Депозит уникален по (сеть, tx_hash, log_index), доставка — по (депозит, событие). Это ограничения базы, а не проверки в коде.

Что приходит вашему серверу

Один POST на HTTPS-адрес, который вы указали. Подпись — HMAC-SHA256 по строке <timestamp>.<тело>, проверяется по сырым байтам запроса.

Ответьте 2xx. Иначе Coinwing повторит через 1м, 5м, 25м, 2ч, 6ч и 24ч, а потом оставит доставку оператору. Ключ идемпотентности — deposit_id: он один и тот же для всех событий и повторов.

POST /coinwing/webhook
Coinwing-Event: deposit.confirmed
Coinwing-Signature: t=1735689600,v1=<hex>

{
  "event": "deposit.confirmed",
  "data": {
    "deposit_id": "0b1c…",
    "account_external_id": "42",
    "chain": "base",
    "token": {"symbol": "USDC", "decimals": 6},
    "amount": "1000000",
    "usd": {"value": "1.00", "stale": false},
    "tx_hash": "0xabc…", "log_index": 0,
    "block_number": 47700123,
    "status": "confirmed"
  }
}

Сети и активы

Base

USDC · USDT

Подтверждение по finalized

Ethereum

USDC · USDT

Подтверждение по finalized

Нативная монета

ETH

Включается по сети отдельно

Новая сеть или второй стейблкоин добавляются конфигурацией — код для этого трогать не нужно.

Закрытая бета

Подключаем проекты вручную

Заводим мерчанта, принимаем ваш xpub и вместе проводим первый платёж на тестовой сумме — до того, как через сервис пойдут деньги клиентов.

Запросить приглашение