Архитектура real-time конвертации криптоактивов в фиат для карточек
Пользователь держит USDC, хочет заплатить картой в обычном магазине. В момент транзакции по карте: USDC списывается с крипто-баланса, конвертируется в USD/EUR, и процессинг карты проходит как обычная фиатная оплата. С точки зрения терминала — обычная Visa/Mastercard транзакция. Это не теория, это работающая архитектура за такими продуктами как Crypto.com Card, Binance Card, Coinbase Card.
Мы — команда блокчейн-инженеров с более чем 8-летним опытом в крипто- и платёжных решениях. За нами более 15 реализованных проектов по интеграции карт для цифровых активов. Разрабатываем систему под ключ: от выбора BIN-спонсора до запуска виртуальных и физических карт. Закажите разработку — мы оценим ваш проект и предложим сроки от 6 месяцев.
Построить такую систему с нуля — значит решить несколько независимых инженерных задач: эмиссия карт, real-time конвертация, BIN-спонсорство и лицензирование, compliance. Каждая из них — отдельный трек работы.
Что входит в работу
- Архитектурный дизайн системы с учётом ваших объёмов и регионов.
- Выбор и интеграция BIN-спонсора (Marqeta, Galileo или другого).
- Реализация JIT-логики (Just-In-Time funding) — вебхук авторизации за <2 сек.
- Подключение liquidity-провайдеров (CEX, OTC, embedded liquidity) для конвертации цифровых активов в фиат.
- Настройка KYC/AML (Sumsub, Chainalysis) и tax-reporting модуля.
- Выпуск виртуальных и физических карт, интеграция с Apple Pay / Google Pay.
- Документация API, CI/CD, развёртывание.
Какие архитектурные компоненты нужны?
BIN-спонсорство и эмиссия карт
BIN (Bank Identification Number) — первые 6–8 цифр карты, определяют эмитента. Без собственной банковской лицензии работают через BIN-спонсора: лицензированный банк-эмитент, который выпускает карты под своим BIN, но по вашей логике. Вы — program manager.
Основные BIN-спонсоры и card issuing платформы:
| Провайдер | Сети | Регионы | API |
|---|---|---|---|
| Marqeta | Visa, Mastercard | US, EU, UK | REST + Webhooks |
| Galileo | Visa | US, LATAM | REST |
| Stripe Issuing | Visa, Mastercard | US, EU | REST |
| Moorwand | Mastercard | EU/EEA | REST |
| Railsbank (Railsr) | Visa, Mastercard | EU, UK | REST |
Marqeta — наиболее распространён в crypto-card проектах (Coinbase Card использует Marqeta). Just-In-Time (JIT) funding — ключевая фича: Marqeta вызывает ваш webhook в момент авторизации, вы подтверждаете или отклоняете транзакцию с конвертацией в реальном времени.
Just-In-Time funding: логика в реальном времени
JIT — сердце архитектуры. Схема:
Карточный терминал → Visa/MC network → Marqeta → ваш JIT webhook (< 2 сек) →
[вы конвертируете цифровые активы → фиат] → ответ approve/decline → Marqeta → терминал
Время ответа на JIT webhook: строго менее 2 секунд. Это аппаратный таймаут карточных сетей. Пропустил — транзакция автоматически отклоняется. Согласно документации Marqeta, средняя задержка API составляет ~200 мс, что оставляет запас для цепочки конвертации.
// JIT webhook handler
import { FastifyRequest, FastifyReply } from 'fastify';
import { MarqetaJITPayload } from './types';
export async function handleJITFunding(
req: FastifyRequest<{ Body: MarqetaJITPayload }>,
reply: FastifyReply,
) {
const startTime = Date.now();
const { transaction, card_token } = req.body;
try {
// 1. Идентификация пользователя по card_token
const user = await userService.findByCardToken(card_token);
if (!user) return reply.send({ result: 'DECLINED', memo: 'USER_NOT_FOUND' });
// 2. Получаем сумму в фиат валюте
const { currency_code, amount } = transaction;
// 3. Рассчитываем сумму цифровых активов для списания
const cryptoAmount = await pricingService.fiatToCrypto({
fiatAmount: amount,
fiatCurrency: currency_code,
cryptoCurrency: user.primaryAsset, // USDC, BTC, ETH
});
// 4. Проверяем баланс
const balance = await walletService.getBalance(user.id, user.primaryAsset);
if (balance < cryptoAmount.amountWithFee) {
return reply.send({ result: 'DECLINED', memo: 'INSUFFICIENT_FUNDS' });
}
// 5. Резервируем цифровые активы (hold, не списываем сразу)
const holdId = await walletService.createHold({
userId: user.id,
asset: user.primaryAsset,
amount: cryptoAmount.amountWithFee,
expiresAt: new Date(Date.now() + 30 * 60 * 1000), // 30 мин
transactionRef: transaction.token,
});
// Проверяем что укладываемся в таймаут
if (Date.now() - startTime > 1500) {
await walletService.releaseHold(holdId);
return reply.send({ result: 'DECLINED', memo: 'TIMEOUT' });
}
return reply.send({
result: 'APPROVED',
funding: { amount, currency_code },
});
} catch (error) {
logger.error({ error, transaction }, 'JIT funding error');
return reply.send({ result: 'DECLINED', memo: 'INTERNAL_ERROR' });
}
}
Как работает hold-механизм?
Авторизация карты и фактическое списание (clearing) — разные события. Между ними может пройти до 5 дней (особенно для оффлайн транзакций). Hold резервирует крипто-баланс, реальная конвертация происходит при clearing. Это предотвращает overspending при множественных авторизациях.
Liquidity providers и FX (Foreign Exchange)
Для конвертации цифровых активов в фиат в автоматическом режиме:
- CEX через API: Binance, Coinbase Prime, Kraken. Подходит для средних объёмов. Риск: API latency, биржа может быть недоступна. Нужен failover на второй provider.
- OTC / Prime Brokers: Galaxy Digital, FalconX, Cumberland. Для крупных объёмов ($100k+) дают лучшие ставки, работают через API или RFQ.
- Embedded liquidity: интеграция с Fireblocks Settlement Network или B2C2. Программный доступ, фиксированные спреды, enterprise SLA.
Средняя экономия при использовании multi-provider роутинга составляет до 20% по сравнению с single provider.
Пример реализации LiquidityRouter
interface LiquidityProvider {
getQuote(params: QuoteParams): Promise<Quote>;
executeConversion(quoteId: string): Promise<ConversionResult>;
getBalance(currency: string): Promise<Decimal>;
}
class LiquidityRouter implements LiquidityProvider {
private providers: LiquidityProvider[];
async getQuote(params: QuoteParams): Promise<Quote> {
// Запрашиваем котировки у всех провайдеров параллельно
const quotes = await Promise.allSettled(
this.providers.map(p => p.getQuote(params))
);
// Выбираем лучшую котировку (по rate с учётом fee)
const validQuotes = quotes
.filter(q => q.status === 'fulfilled')
.map(q => (q as PromiseFulfilledResult<Quote>).value);
return validQuotes.sort((a, b) => b.netRate - a.netRate)[0];
}
}
Как решаются вопросы AML и налогообложения?
KYC и мониторинг транзакций
Обязательный KYC: проверка личности (паспорт/ID), proof of address, OFAC screening. Провайдеры: Sumsub, Jumio, Onfido. Уровни верификации влияют на лимиты: базовый — $500/день, enhanced — $10,000/день.
Transaction monitoring: AML требования включают мониторинг подозрительных паттернов, structuring detection, unusual merchant categories. Используем Chainalysis, Elliptic для крипто-стороны; ComplyAdvantage для фиат.
Лицензирование: В EU — EMI лицензия или партнёрство с лицензированным EMI. В US — Money Transmitter Licence в каждом штате. Получение лицензии: 6–18 месяцев. Альтернатива: работа под лицензией BIN-спонсора.
Конвертация крипто при оплате картой — taxable event в US, UK, большинстве EU. Система генерирует tax-lot записи: актив, дата приобретения, себестоимость, дата списания, сумма и результат. Предоставление tax report (например, 1099 в США) обязательно для лицензированных операций.
Как работают физические и виртуальные карты?
Виртуальные карты выпускаются мгновенно через Marqeta API, используются для Apple Pay / Google Pay — приоритет для быстрого MVP.
Физические карты требуют card personalisation bureau (Matica, Entrust). Срок производства: 5–14 дней. Delivery tracking интеграция.
Freeze/unfreeze — пользователь должен мочь мгновенно заморозить карту через приложение. Marqeta API: cards/{token}/transitions с состоянием SUSPENDED.
Этапы и сроки разработки
| Фаза | Содержание | Срок |
|---|---|---|
| Setup & licensing | Выбор BIN-спонсора, юридическая структура, KYC провайдер | 4–8 нед |
| Core wallet | Крипто-кошелёк, балансы, holds | 3–4 нед |
| JIT funding | Webhook, pricing engine, hold механизм | 3–4 нед |
| Liquidity | FX интеграция, конвертация при clearing | 2–3 нед |
| Card management | Виртуальные карты, Marqeta integration | 3–4 нед |
| Compliance | AML мониторинг, tax reporting | 3–4 нед |
| Physical cards | Производство, delivery | 2–3 нед |
| Testing & launch | End-to-end, UAT, soft launch | 3–4 нед |
Реалистичный срок от нуля до рабочего продукта с виртуальными картами: 6–9 месяцев. Основные блокеры — legal/compliance onboarding с BIN-спонсором и KYC провайдером, а не разработка.
Закажите оценку вашего проекта — получите консультацию по архитектуре и лицензированию. Свяжитесь с нами для предварительной оценки.







