Списать нечем
Сервер провижинится только xpub аккаунта. Он умеет выводить адреса и не умеет подписывать транзакции — терять при взломе нечего.
Некастодиальный приём стейблкоинов
Coinwing следит за EVM-сетями и сообщает вашему приложению о поступивших переводах подписанными вебхуками. На сервере лежит только xpub: он позволяет вывести адрес для платежа и не позволяет списать с него ни цента. Это свойство конструкции, а не настройка, которую можно случайно выключить.
m/44'/60'/0'/0/42→0x9858…4c1a
выведен из xpub
1 000 000 базовых единиц USDC · block 47 700 123
= 1.00 USDC
подтверждений 41 / до finalized
обнаружен
POST /coinwing/webhook→200 OK
подпись HMAC-SHA256
Вы кредитуете клиента на четвёртой строке — не раньше, чем сеть перестала иметь право передумать.
Сид и приватные ключи не покидают вашу машину. Сервису вы отдаёте только xpub — xprv он отклоняет при сохранении.
Один вызов API — один адрес, выведенный из вашего xpub для этого аккаунта. Повторный вызов возвращает тот же адрес.
Каждую сеть смотрят несколько независимых источников. Их результаты объединяются, поэтому молчание или неполный ответ одного из них не прячет платёж.
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: он один и тот же для всех событий и повторов.
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" } }
USDC · USDT
Подтверждение по finalized
USDC · USDT
Подтверждение по finalized
ETH
Включается по сети отдельно
Новая сеть или второй стейблкоин добавляются конфигурацией — код для этого трогать не нужно.
Закрытая бета
Заводим мерчанта, принимаем ваш xpub и вместе проводим первый платёж на тестовой сумме — до того, как через сервис пойдут деньги клиентов.
Запросить приглашение