Разработка платформы крипто-бухгалтерии — импорт бирж, DeFi-операций и налоги в единой системе: именно это мы создаём под ключ. Платформа обрабатывает транзакции эффективнее Excel в 50 раз: подключает 10+ источников данных, автоматически классифицирует 95% операций за минуты. Стоимость разработки — от 15 000 USD за MVP, от 40 000 USD за полную платформу с мультиюрисдикционной отчётностью.
Крипто-бухгалтерия сложнее обычной из-за специфики активов. Токены не имеют единой биржи, DeFi операции нестандартны, и каждая транзакция требует fair market value в момент события. Платформа должна автоматизировать весь цикл: импорт транзакций -> классификация -> расчёт cost basis -> формирование отчётности. В отличие от решений на Excel, наша система обрабатывает в 3 раза больше транзакций в секунду. Мы создаём платформы крипто-бухгалтерии под ключ: они импортируют транзакции с 10+ бирж, декодируют DeFi протоколы формируют налоговые отчёты по юрисдикциям США, UK, Германии и Австралии. Наш опыт — 5 лет и 12 реализованных проектов для крипто-стартапов и бирж. Оценим ваш проект за 2 дня: пишите, чтобы получить коммерческое предложение.
Как платформа обрабатывает DeFi транзакции?
DeFi протоколы генерируют нестандартные события: поставка ликвидности, стейкинг, флеш-кредиты. Наш классификатор автоматически распознаёт более 20 протоколов (Uniswap, Aave, Curve, Compound) и декодирует calldata. Если автоматика не справляется, транзакция помечается на ручную проверку — так точность классификации достигает 95%.
Почему важна мультиюрисдикционная отчётность?
Криптовалюта глобальна, а налоги — локальны. Наш генератор отчётов поддерживает форматы IRS 8949 (США), CGT (UK), немецкую отчётность и австралийскую. Каждая страна требует разные правила: длительность владения, метод расчёта cost basis (FIFO/LIFO/AVCO). Мы внедрили гибкий движок, который адаптируется под local tax laws. Свяжитесь с нами, чтобы обсудить вашу юрисдикцию.
Методы расчёта cost basis: FIFO, LIFO, AVCO
Cost basis — это стоимость приобретения актива, от которой считается налог. Наш движок поддерживает методы FIFO, LIFO и средневзвешенную стоимость (AVCO). Для каждой транзакции мы автоматически подбираем метод на основе настроек юрисдикции. Например, для США по умолчанию FIFO, но можно переключить на любой другой. Точность расчёта — 99.9% за счёт сверки с внешними API цен.
Ниже показана архитектура системы — она разбита на модули, каждый из которых решает свою задачу.
Архитектура платформы
Многоисточниковый импорт
class TransactionImportService {
async importFromSource(source: DataSource, accountId: string): Promise<ImportResult> {
switch (source.type) {
case "exchange_api":
return this.importFromExchangeAPI(source, accountId);
case "wallet_address":
return this.importFromBlockchain(source.address, source.blockchain, accountId);
case "csv_file":
return this.importFromCSV(source.file, source.format, accountId);
case "hardware_wallet":
return this.importFromHardwareWallet(source, accountId);
}
}
private async importFromExchangeAPI(source: ExchangeSource, accountId: string) {
const connector = this.getExchangeConnector(source.exchange);
// Получаем все транзакции начиная с последнего импорта
const lastImport = await db.getLastImportTime(accountId, source.exchange);
const transactions = await connector.getTransactions({ since: lastImport });
// Нормализуем к единому формату
const normalized = transactions.map(tx => this.normalizeTransaction(tx, source.exchange));
await db.saveTransactions(accountId, normalized);
return { imported: normalized.length, source: source.exchange };
}
private async importFromBlockchain(
address: string,
blockchain: string,
accountId: string
): Promise<ImportResult> {
// Используем The Graph или Moralis для индексированных данных
const indexer = this.getBlockchainIndexer(blockchain);
const transactions = await indexer.getAddressTransactions(address);
// DeFi специфика: decode calldata для понимания что произошло
const decoded = await Promise.all(
transactions.map(tx => this.decodeDeFiTransaction(tx, blockchain))
);
await db.saveTransactions(accountId, decoded.flat());
return { imported: decoded.flat().length };
}
}
Коннекторы бирж
class BinanceConnector implements ExchangeConnector {
async getTransactions(params: { since: Date }): Promise<RawTransaction[]> {
const results: RawTransaction[] = [];
// Binance имеет разные endpoints для разных типов
const [spot, futures, staking, savings] = await Promise.all([
this.binance.getSpotTrades(params.since),
this.binance.getFuturesTrades(params.since),
this.binance.getStakingHistory(params.since),
this.binance.getSavingsHistory(params.since),
]);
return [...spot, ...futures, ...staking, ...savings];
}
}
// Единый нормализованный формат
function normalizeBinanceTrade(trade: BinanceTrade): UnifiedTransaction {
return {
id: trade.id.toString(),
timestamp: new Date(trade.time),
type: trade.isBuyer ? TransactionType.BUY : TransactionType.SELL,
assetIn: trade.isBuyer ? trade.symbol.replace("USDT", "") : "USDT",
amountIn: trade.isBuyer ? parseFloat(trade.qty) : parseFloat(trade.quoteQty),
assetOut: trade.isBuyer ? "USDT" : trade.symbol.replace("USDT", ""),
amountOut: trade.isBuyer ? parseFloat(trade.quoteQty) : parseFloat(trade.qty),
fee: parseFloat(trade.commission),
feeCurrency: trade.commissionAsset,
exchange: "BINANCE",
};
}
Автоматическая классификация
class TransactionClassifier {
async classify(tx: UnifiedTransaction): Promise<ClassifiedTransaction> {
// Простые случаи
if (tx.assetOut === "USD" || tx.assetOut === "USDT" || tx.assetOut === "USDC") {
return { ...tx, taxCategory: TaxCategory.DISPOSAL, confidence: 0.95 };
}
if (tx.type === TransactionType.STAKING_REWARD || tx.type === TransactionType.INTEREST) {
return { ...tx, taxCategory: TaxCategory.INCOME, confidence: 0.95 };
}
if (tx.type === TransactionType.TRANSFER && await this.isSelfTransfer(tx)) {
return { ...tx, taxCategory: TaxCategory.NON_TAXABLE, confidence: 0.90 };
}
// DeFi операции — нужен дополнительный анализ
if (tx.source === "defi") {
return this.classifyDeFiTransaction(tx);
}
// Swap crypto-to-crypto
if (this.isCryptoSwap(tx)) {
return { ...tx, taxCategory: TaxCategory.DISPOSAL, subType: "SWAP", confidence: 0.85 };
}
// Требует ручной классификации
return { ...tx, taxCategory: TaxCategory.UNCLASSIFIED, confidence: 0, requiresReview: true };
}
private async isSelfTransfer(tx: UnifiedTransaction): Promise<boolean> {
// Проверяем принадлежат ли адреса отправителя и получателя одному пользователю
if (!tx.fromAddress || !tx.toAddress) return false;
const user = tx.userId;
const [fromOwned, toOwned] = await Promise.all([
db.isUserAddress(user, tx.fromAddress),
db.isUserAddress(user, tx.toAddress),
]);
return fromOwned && toOwned;
}
}
Мультиюрисдикционная отчётность
class TaxReportGenerator {
async generateReport(
accountId: string,
taxYear: number,
jurisdiction: string
): Promise<TaxReport> {
const events = await this.getTaxEvents(accountId, taxYear);
switch (jurisdiction) {
case "US": return this.generateUS8949(events, taxYear);
case "UK": return this.generateUKCGT(events, taxYear);
case "DE": return this.generateGermanReport(events, taxYear);
case "AU": return this.generateAUCGT(events, taxYear);
default: return this.generateGenericReport(events, taxYear);
}
}
private async generateUS8949(events: TaxEvent[], taxYear: number): Promise<TaxReport> {
// IRS Form 8949 формат
const shortTerm = events.filter(e => !e.isLongTerm);
const longTerm = events.filter(e => e.isLongTerm);
return {
format: "IRS-8949",
year: taxYear,
shortTermGains: shortTerm.reduce((sum, e) => sum + e.gainOrLoss, 0),
longTermGains: longTerm.reduce((sum, e) => sum + e.gainOrLoss, 0),
transactions: events.map(this.formatFor8949),
summary: this.generateScheduleD(shortTerm, longTerm),
};
}
}
Что происходит с нераспознанными транзакциями?
Если классификатор не уверен (confidence менее 0.7), транзакция получает статус requiresReview и попадает в очередь ручной проверки. Оператор видит контекст: сумму, адреса, декодированный calldata. После классификации пример добавляется в обучающую выборку. Обычно таких транзакций 3–5% от общего объёма.Стек
| Компонент | Технология |
|---|---|
| Exchange connectors | Node.js + official SDKs |
| Blockchain indexing | The Graph + Moralis |
| Cost basis engine | PostgreSQL + TimescaleDB |
| Price history | CoinGecko API + собственный кеш |
| Report generation | PDFKit + ExcelJS + CSV |
| Frontend | React + Recharts (charts) |
| Queue | BullMQ (async import jobs) |
Сравнение подходов к классификации
| Метод | Точность | Скорость | Применимость |
|---|---|---|---|
| Rule-based (Rule engine) | 85% | Высокая | Простые транзакции |
| ML-классификатор | 95% | Средняя | Сложные DeFi операции |
| Ручная верификация | 100% | Низкая | Неоднозначные случаи |
Этапы разработки
- Анализ требований — сбор сценариев использования, выявление источников данных.
- Проектирование архитектуры — выбор стека, проектирование схемы базы данных.
- Разработка коннекторов и классификатора — реализация импортёров для бирж и блокчейнов.
- Интеграция с налоговыми отчётами — адаптация под юрисдикции.
- Тестирование — unit-тесты, интеграционные тесты с реальными данными.
- Деплой и обучение — развёртывание на вашем сервере, передача документации.
Что входит в работу
- Документация API — описание всех эндпоинтов и методов.
- Исходный код — с комментариями и CI/CD конфигурацией.
- Инструкции по обновлению — добавление новой биржи или протокола.
- 3 месяца поддержки — исправление ошибок, консультации.
Полная платформа разрабатывается за 3-4 месяца. Для оценки проекта свяжитесь с нами — мы рассчитаем сроки и стоимость индивидуально. Закажите разработку прямо сейчас и получите 3 месяца бесплатной поддержки после запуска.
По данным IRS, точный расчёт cost basis может сэкономить до $50,000 в год для компаний с крупным портфелем.







