Разработка системы классификации крипто-транзакций
При 5000+ транзакций за год налоговая требует детальную отчётность. Каждая неправильно классифицированная транзакция — риск доначислений. Для трейдеров, стейкеров и участников DeFi разобраться в этом вручную почти невозможно. Мы разрабатываем систему, которая автоматически относит каждую операцию к нужному налоговому типу: trade, income, airdrop или staking reward. Результат — снижение ручного труда на 80–90% и полная уверенность в отчётности. Всё строится на rule engine для типовых случаев, ML fallback для сложных и manual review queue. Получите консультацию — оценим ваш проект бесплатно.
Как система классификации крипто-транзакций снижает налоговые риски?
Налоговые органы всё чаще запрашивают детализацию крипто-операций. В США IRS требует отдельно отчитывать airdrop и staking reward, в Германии — различать краткосрочные и долгосрочные холды. Ошибка в классификации может стоить тысяч долларов. Система использует комбинацию правил, проверяемых аудиторами, и ML-модели, обученной на реальных данных. Это обеспечивает точность свыше 95% для типовых случаев и снижает ручную работу на 80–90%.
Как мы строим систему: rule engine и ML fallback
Иерархия типов транзакций
enum TaxCategory {
// Capital events
BUY = "buy",
SELL = "sell",
SWAP = "swap",
NFT_MINT = "nft_mint",
NFT_SALE = "nft_sale",
NFT_ROYALTY = "nft_royalty",
// Income events
STAKING_REWARD = "staking_reward",
MINING_REWARD = "mining_reward",
LENDING_INTEREST = "lending_interest",
LIQUIDITY_FEES = "liquidity_fees",
AIRDROP = "airdrop",
HARD_FORK = "hard_fork",
REFERRAL = "referral",
PLAY_TO_EARN = "play_to_earn",
// Non-taxable
TRANSFER = "transfer",
COLLATERAL_DEPOSIT = "collateral",
COLLATERAL_RETURN = "collateral_return",
WRAPPED_TOKEN_MINT = "wrap",
WRAPPED_TOKEN_BURN = "unwrap",
LP_DEPOSIT = "lp_deposit",
LP_WITHDRAWAL = "lp_withdrawal",
// Gas
GAS_FEE = "gas_fee",
UNCLASSIFIED = "unclassified",
}
Это базовая таксономия, покрывающая 99% операций. При необходимости добавляются кастомные категории под конкретный проект.
Движок классификации
class TransactionClassifier {
async classify(tx: UnifiedTransaction, userContext: UserContext): Promise<ClassificationResult> {
const rules = this.getRulesForContext(userContext);
for (const rule of rules) {
const result = await rule.apply(tx, userContext);
if (result.matched) {
return {
category: result.category,
confidence: result.confidence,
ruleId: rule.id,
metadata: result.metadata,
};
}
}
return {
category: TaxCategory.UNCLASSIFIED,
confidence: 0,
requiresManualReview: true,
};
}
}
Правила применяются по приоритетам. Примеры правил:
const CLASSIFICATION_RULES: ClassificationRule[] = [
{
id: "SELF_TRANSFER",
priority: 100,
apply: async (tx, ctx) => {
if (tx.fromAddress && tx.toAddress) {
const [from, to] = await Promise.all([
ctx.isUserAddress(tx.fromAddress),
ctx.isUserAddress(tx.toAddress),
]);
if (from && to) return { matched: true, category: TaxCategory.TRANSFER, confidence: 0.95 };
}
return { matched: false };
},
},
{
id: "WRAPPED_TOKEN",
priority: 90,
apply: async (tx) => {
const wrappedPairs = [
["ETH", "WETH"], ["BTC", "WBTC"], ["SOL", "SOL"],
["MATIC", "WMATIC"],
];
const isWrap = wrappedPairs.some(
([native, wrapped]) =>
(tx.assetIn === native && tx.assetOut === wrapped) ||
(tx.assetIn === wrapped && tx.assetOut === native)
);
if (isWrap) return {
matched: true,
category: tx.assetIn.startsWith("W") ? TaxCategory.WRAPPED_TOKEN_BURN : TaxCategory.WRAPPED_TOKEN_MINT,
confidence: 0.95
};
return { matched: false };
},
},
{
id: "STAKING_REWARD_PATTERN",
priority: 85,
apply: async (tx) => {
if (tx.type === "receive" && !tx.assetOut && tx.source === "staking") {
return { matched: true, category: TaxCategory.STAKING_REWARD, confidence: 0.90 };
}
const isStakingContract = await isKnownStakingContract(tx.fromAddress);
if (tx.type === "receive" && isStakingContract) {
return { matched: true, category: TaxCategory.STAKING_REWARD, confidence: 0.80 };
}
return { matched: false };
},
},
{
id: "AIRDROP_PATTERN",
priority: 80,
apply: async (tx) => {
if (tx.type === "receive" && !tx.assetOut) {
const isMassDistribution = await checkMassDistribution(tx.txHash, tx.assetIn);
if (isMassDistribution) {
return { matched: true, category: TaxCategory.AIRDROP, confidence: 0.75 };
}
}
return { matched: false };
},
},
{
id: "CRYPTO_SWAP",
priority: 50,
apply: async (tx) => {
if (tx.assetIn && tx.assetOut &&
!isFiat(tx.assetIn) && !isFiat(tx.assetOut) &&
tx.assetIn !== tx.assetOut) {
return { matched: true, category: TaxCategory.SWAP, confidence: 0.85 };
}
return { matched: false };
},
},
];
ML-модель для неизвестных паттернов
Если ни одно правило не сработало, подключается ML-классификатор. Мы используем RandomForest, обученный на исторических данных. Вектор признаков включает сумму, типы отправителя/получателя (EOA vs контракт), отношение value in/out, время между транзакциями и другие метрики.
from sklearn.ensemble import RandomForestClassifier
import numpy as np
class TransactionMLClassifier:
def predict(self, tx_features):
features = self.extract_features(tx_features)
prediction = self.model.predict([features])[0]
confidence = max(self.model.predict_proba([features])[0])
return { "category": prediction, "confidence": confidence }
ML-модель даёт гипотезу, но мы всегда даём пользователю возможность переклассифицировать транзакцию вручную.
Batch-классификация и review queue
async function processUnclassifiedTransactions(userId: string) {
const unclassified = await db.getUnclassified(userId, { limit: 50 });
for (const tx of unclassified) {
const suggestions = await classifier.getSuggestions(tx, { topN: 3 });
await db.updateTransactionSuggestions(tx.id, suggestions);
}
if (unclassified.length > 0) {
await notifyUserReviewNeeded(userId, unclassified.length);
}
}
Транзакции с confidence < 0.9 отправляются в очередь на проверку. Пользователь видит предлагаемые категории и утверждает/корректирует. По опыту, в очередь попадает не более 20% операций.
Сравнение rule-based и ML-подхода
| Критерий | Rule-based | ML fallback |
|---|---|---|
| Точность для типовых транзакций | 95–98% | 85–90% |
| Скорость обработки | <10ms | <100ms |
| Требуемые данные | On-chain + пользовательские адреса | Исторические размеченные данные |
| Адаптация к новым сценариям | Требует добавления правил | Автоматическая переобучка |
| Прозрачность | Полная | «Чёрный ящик» |
Rule-based быстрее и точнее для типовых случаев, ML спасает для незнакомых. Вместе они покрывают 99% транзакций.
Примеры налоговой трактовки по типам транзакций
| Тип транзакции | Налоговый статус (пример) |
|---|---|
| SWAP | Событие, облагаемое налогом на прирост капитала |
| STAKING_REWARD | Доход, облагаемый как обычный доход |
| AIRDROP | Доход по рыночной стоимости на момент получения |
| TRANSFER | Не облагается (смена кошелька) |
| GAS_FEE | Расход, уменьшающий налогооблагаемую базу |
Этапы разработки
- Аналитика — изучаем ваши данные, определяем полный список типов транзакций.
- Проектирование — проектируем иерархию категорий, подготавливаем онтологию.
- Реализация — пишем rule engine и ML-модуль, интегрируем с кошельками/биржами.
- Тестирование — прогоняем на исторических данных, корректируем правила.
- Деплой — разворачиваем систему, настраиваем review queue и уведомления.
Что входит в результат
- Rule engine с предустановленными правилами под вашу юрисдикцию.
- ML-модель, дообученная на ваших данных.
- Web-дашборд для просмотра и ручной классификации.
- REST API для интеграции с бухгалтерскими системами.
- Документация и обучение команды.
- Поддержка в течение 6 месяцев.
Как мы гарантируем точность?
У нас 10+ лет опыта в блокчейн-разработке. За плечами более 50 проектов по анализу данных и автоматизации. Каждая система перед сдачей проходит аудит на тестовых данных. Мы предоставляем гарантию на корректность классификации для транзакций с confidence > 0.95. В случае ошибок — бесплатная донастройка.
Сроки и стоимость
Сроки разработки: от 2 до 4 недель в зависимости от сложности интеграции. Стоимость рассчитывается индивидуально после анализа вашего объёма транзакций и требований к классификации. Закажите предварительную оценку — это бесплатно.
Пример классификации сложной транзакции
Транзакция: получение 0.1 ETH с нового контракта, на выходе 1000 UNI. Правила не срабатывают (неизвестный контракт, не массовая рассылка). ML предполагает airdrop с confidence 0.4. Пользователь вручную классифицирует как стейкинг-вознаграждение. После этой корректировки мы можем добавить новое правило для данного пула.Свяжитесь с нами для бесплатной консультации. Получите демонстрацию системы — оценим ваш проект.







