Решение проблемы мультикриптовалютных платежей
Отметим: когда бизнес решает принимать криптовалюты, часто представляют простую кнопку «Оплатить в BTC». Реальность сложнее: система должна понимать UTXO-модель Bitcoin, account-based модель EVM с её ERC-20 токенами, а также Solana с SPL-стандартом — и всё это без потери средств. Ошибка в выборе архитектуры может привести к потере транзакции или нарушению compliance. На основе 50+ проектов мы выработали универсальную схему, покрывающую 90% потребностей. Мы решаем проблему мультивалютных платежей, обеспечивая приём Bitcoin, Ethereum, USDT (ERC-20 и TRC-20), Solana USDC и других токенов. Кастомный крипто-платежный шлюз даёт полный контроль над комиссиями, временем подтверждения и безопасностью. В одном из недавних кейсов мы интегрировали 7 сетей за 10 рабочих дней, обеспечив сквозную видимость платежей в реальном времени. Используем Foundry для компиляции смарт-контрактов и viem для мониторинга EVM-сетей. Каждая интеграция включает настройку подтверждений: для Bitcoin минимум 3, для EVM — 12 блоков, для Solana — финализованный слот. Это сократило количество ошибочных зачислений до нуля.
Архитектурные варианты: какой выбрать для вашего объема
Выбор архитектуры сводится к трем вариантам. Кастомная интеграция окупается в 1.5-2 раза быстрее готового провайдера при ежемесячных объемах от $50 000 — экономия на комиссиях может достигать заметных сумм.
| Критерий | Готовый провайдер | Кастомная интеграция | Гибридный подход |
|---|---|---|---|
| Время запуска | 1-2 дня | 2-4 недели | 1-2 недели |
| Комиссия на транзакцию | 0.5-1% | 0% (только газ сети) | 0% для EVM, ~0.5% для BTC |
| Контроль над UX | Ограничен | Полный | Высокий |
| Vendor lock-in | Есть | Нет | Частичный |
| Окупаемость при объеме >$50k/мес | Не окупается | 3-6 месяцев | 6-12 месяцев |
При ежемесячном объёме свыше $50 000 кастомная интеграция окупается за 3–6 месяцев, экономя от $1 500 на комиссиях по сравнению с готовыми провайдерами.
Как генерировать адреса для всех сетей из одного seed (HD Wallet)
Отметим: как указано в BIP-44, иерархия: m / purpose' / coin_type' / account' / change / address_index. Для каждого нового платежа генерируется новый адрес через инкремент address_index. Один master seed — адреса для всех сетей.
from hdwallet import HDWallet
def derive_address(master_seed: str, coin_type: int, index: int) -> str:
wallet = HDWallet()
wallet.from_mnemonic(master_seed)
# BTC: coin_type=0, ETH: coin_type=60, SOL: coin_type=501
wallet.from_path(f"m/44'/{coin_type}'/0'/0/{index}")
return wallet.p2pkh_address() # для BTC
# wallet.address() для ETH
Пример генерации адресов
Для Bitcoin используем coin_type=0, для Ethereum coin_type=60, для Solana coin_type=501. Храните address_index в БД и монотонно увеличивайте его, никогда не переиспользуйте адреса.
Важно: address_index должен монотонно расти и храниться в БД. Никогда не переиспользовать адреса — это нарушает privacy и усложняет reconciliation.
Интеграция по сетям
EVM-сети (Ethereum, Polygon, BSC, Arbitrum, Base)
Одна кодовая база — несколько RPC endpoint'ов. Мониторинг Transfer событий ERC-20 + нативных ETH/MATIC переводов.
import { createPublicClient, http, parseAbi } from 'viem';
import { mainnet, polygon, arbitrum } from 'viem/chains';
const chains = [
{ chain: mainnet, rpc: process.env.ETH_RPC, tokens: ETH_TOKENS },
{ chain: polygon, rpc: process.env.POLY_RPC, tokens: POLY_TOKENS },
{ chain: arbitrum, rpc: process.env.ARB_RPC, tokens: ARB_TOKENS },
];
// Единый обработчик для всех EVM сетей
async function watchEVMPayment(client, tokenAddress, recipientAddress, orderId) {
return client.watchContractEvent({
address: tokenAddress,
abi: ERC20_ABI,
eventName: 'Transfer',
args: { to: recipientAddress },
onLogs: (logs) => handlePayment(logs, orderId),
});
}
Bitcoin: почему мы рекомендуем Fulcrum
Bitcoin UTXO-модель — нет «баланса», есть набор unspent outputs. Адрес считается оплаченным когда на него пришли UTXO с нужной суммой. Варианты интеграции: Electrum Protocol (ElectrumX/Fulcrum) — blockchain.scripthash.subscribe для подписки на изменения адреса; BlockCypher/Mempool.space API — без собственной инфраструктуры; Bitcoin Core + ZMQ — полная нода с ZeroMQ нотификациями. Для production рекомендуем Fulcrum (быстрая SPV-совместимая нода) + собственный Bitcoin Core в pruned mode. Подтверждения Bitcoin: 1 подтверждение (~10 минут) — для небольших сумм, 3+ — стандарт, 6 — для крупных платежей.
TRON (USDT TRC-20)
TRON — отдельный случай из-за популярности USDT TRC-20 в СНГ и Азии. API через TronGrid (HTTP) или собственная нода. Адреса в Base58Check формате (начинаются с T).
import tronpy
client = tronpy.Tron(network='mainnet')
def check_trc20_payment(address: str, contract: str, min_amount: int) -> list:
txns = client.get_token_trc20_transfers(
contract_address=contract,
to_address=address,
min_timestamp=int((time.time() - 3600) * 1000)
)
return [tx for tx in txns if tx['value'] >= min_amount]
Solana: USDC и SPL-токены
Согласно документации Solana, каждый токен имеет свой Associated Token Account (ATA) для каждого кошелька. Адрес для приёма USDC — не сам кошелёк, а его ATA для USDC.
import { getAssociatedTokenAddress } from '@solana/spl-token';
const usdcMint = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
const paymentATA = await getAssociatedTokenAddress(usdcMint, paymentKeypair.publicKey);
Solana финальность: при использовании commitment level finalized — ~32 слота (~13 секунд).
Единая система мониторинга состояний платежей
Независимо от сети, платёж проходит через одно состояние: pending_payment -> mempool_detected -> confirmed (N conf) -> settled. PostgreSQL схема:
CREATE TABLE payment_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
order_id VARCHAR(100) UNIQUE NOT NULL,
currency VARCHAR(20) NOT NULL,
network VARCHAR(20) NOT NULL,
payment_address VARCHAR(200) NOT NULL,
expected_amount NUMERIC(30, 8) NOT NULL,
received_amount NUMERIC(30, 8) DEFAULT 0,
tx_hash VARCHAR(200),
confirmations INTEGER DEFAULT 0,
required_confirmations INTEGER NOT NULL,
status VARCHAR(30) DEFAULT 'pending',
expires_at TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
INDEX idx_payment_address (payment_address),
INDEX idx_status_expires (status, expires_at)
);
Для наглядности, рекомендуемые числа подтверждений:
| Сеть | Рекомендуемое число подтверждений | Время одного блока |
|---|---|---|
| Bitcoin | 3-6 | ~10 минут |
| Ethereum | 12 | ~12 секунд |
| Solana (finalized) | 1 | ~13 секунд |
| Tron | 19 | ~3 секунды |
Курсы и tolerance: как защититься от волатильности
Пользователь видит «оплатите 0.001523 BTC» — курс зафиксирован на 15-30 минут. За это время курс может измениться на 1-2%. Нужен tolerance: для стейблкоинов 0.1%, для BTC 1%, для ETH 1.5%. Курсы с минимальной задержкой: CoinGecko API (бесплатно, кэш 60 сек) или Binance WebSocket (реалтайм, для high-frequency).
Безопасность: что мы гарантируем
- Приватные ключи никогда не на веб-сервере. HD-кошелёк seed в HSM или минимум в зашифрованном хранилище (AWS KMS, HashiCorp Vault).
- Sweep транзакции — автоматический перевод поступивших средств на холодный кошелёк по расписанию или по порогу суммы.
- Double-spend protection — для BTC и ETH не подтверждать платёж по первому unconfirmed. Настроить required_confirmations адекватно сумме.
- Адресная валидация — перед сохранением адрес проходит checksum-валидацию (EIP-55 для ETH, Base58Check для BTC). Ошибка в адресе = потеря средств.
При стоимости одной транзакции $100 комиссия в сети Ethereum составляет ~$2, но при кастомном шлюзе вы контролируете газ и можете снизить её до $0.50. Для 1000 транзакций в месяц экономия составит $1 500.
Что входит в нашу работу
- Документация архитектуры и схема потоков транзакций.
- Исходный код интеграции с каждой сетью (EVM, Bitcoin, Tron, Solana).
- Инфраструктурные скрипты для развертывания RPC-узлов или конфигурации провайдеров.
- Инструкции по эксплуатации и восстановлению после сбоев.
- Обучение вашей команде работе с системой.
- Поддержка в течение первого месяца после запуска.
Процесс внедрения
- Аналитика (1-2 дня): определяем нужные валюты, объемы, географию (TRON популярен в СНГ/Азии), требования к подтверждениям.
- Инфраструктура (2-4 дня): настраиваем RPC-провайдеры или собственные ноды, интегрируем HD wallet, проектируем схему БД.
- Мониторинг (3-4 дня): разрабатываем worker-ы для каждой сети, логику подтверждений, webhook-нотификации.
- Тестирование (1-2 дня): testnet для EVM и Solana, Bitcoin testnet, edge cases (underpayment, overpayment, expired order, reorg).
Итого 1-2 недели в зависимости от количества сетей. Свяжитесь с нами для оценки точных сроков под ваш проект.
Закажите аудит текущей инфраструктуры — мы найдем узкие места.







