Розроблення системи управління крипто-картою
Крипто-карта — це мість між on-chain активами та традиційною платіжною інфраструктурою. Користувач тримає USDC, платить у звичайному магазині — система конвертує та списує у фоні. Побудувати це складніше ніж здається: тут перетинаються card issuing, real-time конвертація, compliance та блокчейн-інфраструктура. Розберемо, з чого це складається.
Card Issuing: з кім працювати
Самостійно отримати BIN спонсора та емітувати карти — довго та дорого (Visa/Mastercard партнерство, $500k+ депозити, 12–18 місяців). Реалістичний шлях — працювати через card issuing платформи:
Marqeta — лідер рринку, програмовані карти через Just-in-Time (JIT) Funding. Ключова фіча: при кожній авторизації Marqeta робить webhook на ваш сервер, ви вирішуєте — затвердити або відкинути та миттєво профінансувати транзакцію. Ідеально для крипто-карт.
Lithic (бувший Privacy) — аналог Marqeta, часто переважніший для стартапів через простіший onboarding.
Moorwand / Railsr (Європа) — для європейських карт з IBAN.
Monavate / Paymentology — альтернативи з більш гнучкими умовами для крипто-native компаній.
Всі ці провайдери дають REST API для видачі карт, управління лімітами, отримання транзакцій.
Архітектура системи
JIT Funding: ядро крипто-карти
Just-in-Time Funding — коли баланс на карті завжди нульовий, гроші з'являються тільки в момент авторизації. Для крипто-карти це означає: користувач авторизує покупку → card processor викликає ваш webhook → ви конвертуєте крипто в фіат → підтверджуєте транзакцію — все за 1–2 секунди.
interface AuthorizationWebhook {
type: "authorization";
token: string;
card_token: string;
amount: number; // у центах
currency: string; // ISO 4217
merchant: {
descriptor: string;
mcc: string;
country: string;
};
created: string;
}
async function handleAuthorization(
webhook: AuthorizationWebhook
): Promise<AuthorizationResponse> {
// 1. Знайти користувача та його крипто-баланс
const user = await getUserByCardToken(webhook.card_token);
const requiredUsd = webhook.amount / 100;
// 2. Перевірити доступний баланс в USDC
const usdcBalance = await getUsdcBalance(user.walletAddress);
if (usdcBalance < requiredUsd * 1.01) { // +1% буфер на slippage
return { decision: "DECLINE", reason: "INSUFFICIENT_FUNDS" };
}
// 3. Зарезервувати кошти (soft lock)
const reservation = await reserveFunds(user.id, requiredUsd, webhook.token);
// 4. Підтвердити авторизацію
return {
decision: "APPROVE",
amount: webhook.amount,
reservation_id: reservation.id,
};
}
Webhook повинен відповісти за 1–2 секунди. Таймаут означає автоматичне відхилення транзакції. Це жорстка вимога, яка визначає всю архітектуру: жодних синхронних блокчейн операцій у цьому шляху.
Settlement та реальне списання
Після авторизації йде settlement — фактичне переміщення коштів. Може відбутися хвилини або години після авторизації. Тут виконується реальна конвертація крипти.
async function settleTransaction(settlementData: SettlementEvent): Promise<void> {
const reservation = await getReservation(settlementData.authorization_token);
// Для USDC — просто перевести на фіатний рахунок через USDC → USD off-ramp
// (Circle, Stripe Crypto, Bridge.xyz)
const offRampResult = await circleOffRamp({
amount: reservation.usdAmount,
destinationBankAccount: OPERATIONAL_ACCOUNT,
});
// Оновити баланс користувача
await deductUserBalance(reservation.userId, reservation.usdcAmount);
// Відправити push сповіщення
await sendTransactionNotification(reservation.userId, {
amount: reservation.usdAmount,
merchant: settlementData.merchant.descriptor,
txId: offRampResult.id,
});
}
Конвертація: USDC vs волатильні активи
USDC/USDT — найпростіший випадок. 1 USDC ≈ 1 USD, конвертація тривіальна. Більшість крипто-карт першого покоління працюють тільки зі стейблкоїнами.
ETH/BTC та інші — потрібен real-time price feed та управління ціновим ризиком. Варіанти:
- Конвертувати в USDC при поповненні — користувач явно міняє ETH → USDC, далі все як вище. Найпростіший підхід.
- Конвертувати в момент транзакції — вище ризик slippage та цінового gap між авторизацією та settlement. Вимагає hedging стратегії.
- Віртуальний баланс + періодичний settlement — агрегувати транзакції, конвертувати батчами. Знижує transaction costs, але ускладнює accounting.
Compliance та KYC
Крипто-карта з реальним використанням — це фінансовий продукт, що регулюється як мінімум як електронні гроші. Обов'язкові компоненти:
KYC/AML — провайдери: Sumsub, Persona, Onfido. Інтеграція через REST API + webhook на eventos верифікації. Мінімальний tier: документ + selfie. Для вищих лімітів — Enhanced Due Diligence (EDD).
Transaction monitoring — аналіз on-chain історії адрес користувачів. Chainalysis API або Elliptic для перевірки: не поступають лі кошти зі sanкційних адрес, міксерів, darknet ринків.
Лімити за умовчанням — поки KYC не пройдено: наприклад, 150 EUR/мес (під PSD2 exemption). Після верифікації — стандартні лімити. Це вимога card schemes, не ваша придумка.
Технічний стек
| Компонент | Варіанти | Рекомендація |
|---|---|---|
| Card issuing | Marqeta, Lithic | Marqeta для JIT Funding |
| Backend | Node.js/TypeScript, Go | Go для latency-sensitive webhook handler |
| База даних | PostgreSQL | + Redis для reservation locks |
| Блокчейн | Viem, ethers.js | Viem для EVM |
| Off-ramp | Circle, Bridge.xyz | Circle USDC → USD |
| KYC | Sumsub, Persona | Sumsub — найкращий охват країн |
| Сповіщення | Firebase, Appcenter | Firebase для push |
Webhook handler для авторизації повинен працювати як окремий високодоступний сервіс з SLA 99.9%+, мінімальною кількістю залежностей та локальним кешем для швидких перевірок балансу.
Графік
MVP (USDC карта, один регіон, базовий KYC): 3–5 місяців. Повнофункціональний продукт з мультивалютою, multi-chain, продвинутим compliance — 8–14 місяців. Значна частина часу — не код, а юридична структура, партнерські договори з card issuer та банком-емітентом.







