Розробка системи обліку DeFi-операцій для податків

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка системи обліку DeFi-операцій для податків
Складний
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

Система обліку DeFi-операцій для податків

DeFi транзакції — найскладніша частина крипто-податкового обліку. Uniswap V3 зосереджена ліквідність, Aave flash loan, Curve стейблкоін своп, Compound cTokens, Yearn vault депозити — кожен протокол має унікальну семантику, яку потрібно декодувати та класифікувати.

Декодування DeFi транзакцій

On-chain ідентифікація протоколу

const KNOWN_PROTOCOLS: Record<string, ProtocolInfo> = {
  "0xE592427A0AEce92De3Edee1F18E0157C05861564": { name: "Uniswap V3 Router", type: "DEX" },
  "0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45": { name: "Uniswap V3 Router 2", type: "DEX" },
  "0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F": { name: "SushiSwap Router", type: "DEX" },
  "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D": { name: "Uniswap V2 Router", type: "DEX" },
  "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2": { name: "Aave V3 Pool", type: "LENDING" },
  "0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B": { name: "Compound Comptroller", type: "LENDING" },
  "0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7": { name: "Curve 3pool", type: "STABLE_SWAP" },
  "0xBA12222222228d8Ba445958a75a0704d566BF2C8": { name: "Balancer Vault", type: "DEX" },
};

async function identifyDeFiProtocol(tx: BlockchainTransaction): Promise<ProtocolInfo | null> {
  return KNOWN_PROTOCOLS[tx.to?.toLowerCase()] ?? null;
}

Декодування за типом протоколу

class DeFiTransactionDecoder {
  async decode(tx: BlockchainTransaction): Promise<TaxableEvent[]> {
    const protocol = await identifyDeFiProtocol(tx);
    
    if (!protocol) {
      // Невідомий протокол — аналізуємо за ERC-20 Transfer подіями
      return this.decodeByTransferEvents(tx);
    }
    
    switch (protocol.type) {
      case "DEX":
        return this.decodeDEXSwap(tx, protocol);
      case "LENDING":
        return this.decodeLendingOperation(tx, protocol);
      case "STABLE_SWAP":
        return this.decodeStableSwap(tx, protocol);
      case "YIELD":
        return this.decodeYieldVault(tx, protocol);
    }
  }
  
  private async decodeDEXSwap(tx: BlockchainTransaction, protocol: ProtocolInfo): Promise<TaxableEvent[]> {
    // Розбираємо Swap подію з логів
    const swapLogs = tx.logs.filter(log => 
      log.topics[0] === UNISWAP_V3_SWAP_TOPIC || log.topics[0] === UNISWAP_V2_SWAP_TOPIC
    );
    
    const events: TaxableEvent[] = [];
    
    for (const swapLog of swapLogs) {
      const [tokenIn, tokenOut, amountIn, amountOut] = await this.parseSwapLog(swapLog);
      
      const priceIn = await this.priceService.getHistoricalPrice(tokenIn, tx.timestamp);
      const priceOut = await this.priceService.getHistoricalPrice(tokenOut, tx.timestamp);
      
      events.push({
        type: TaxEventType.SWAP,
        timestamp: tx.timestamp,
        assetIn: tokenIn,
        amountIn,
        valueInUSD: amountIn * priceIn,
        assetOut: tokenOut,
        amountOut,
        valueOutUSD: amountOut * priceOut,
        protocol: protocol.name,
        txHash: tx.hash,
      });
    }
    
    return events;
  }
  
  private async decodeLendingOperation(tx: BlockchainTransaction, protocol: ProtocolInfo): Promise<TaxableEvent[]> {
    const events: TaxableEvent[] = [];
    
    // Aave Supply — не taxable подія (застава)
    const supplyLog = tx.logs.find(l => l.topics[0] === AAVE_SUPPLY_TOPIC);
    if (supplyLog) {
      return [{ type: TaxEventType.COLLATERAL_DEPOSIT, ...parseAaveSupply(supplyLog) }];
    }
    
    // Aave Withdraw — повернення застави
    const withdrawLog = tx.logs.find(l => l.topics[0] === AAVE_WITHDRAW_TOPIC);
    if (withdrawLog) {
      const { asset, amount } = parseAaveWithdraw(withdrawLog);
      
      // Різниця між виведеною сумою та депозитованою сумою = отримані проценти
      const originalDeposit = await this.db.getAaveDeposit(tx.from, asset);
      const interest = amount - originalDeposit.amount;
      
      if (interest > 0) {
        events.push({
          type: TaxEventType.LENDING_INTEREST,
          asset,
          amount: interest,
          valueUSD: interest * await this.priceService.getHistoricalPrice(asset, tx.timestamp),
        });
      }
      
      events.push({ type: TaxEventType.COLLATERAL_RETURN, asset, amount: originalDeposit.amount });
      return events;
    }
    
    return [];
  }
}

Позиції Uniswap V3 LP

Зосереджена ліквідність Uniswap V3 створює особливу складність: позиція визначається діапазоном тиків, комісії накопичуються окремо, і цінова область in/out-of-range впливає на склад.

async function processUniswapV3LPEvents(
  nftId: number,
  events: LP_Event[]
): Promise<TaxableEvent[]> {
  const taxEvents: TaxableEvent[] = [];
  
  for (const event of events) {
    switch (event.type) {
      case "MINT": {
        // Створення позиції — спірно, залежить від юрисдикції
        // У США: не opodatkovia при депозиті, opodatkovia при виведенні (disposition)
        // LP токен (NFT) отримує cost basis = вартість обох токенів при депозиті
        taxEvents.push({
          type: TaxEventType.LP_MINT,
          token0: event.token0, amount0: event.amount0,
          token1: event.token1, amount1: event.amount1,
          totalValueUSD: await getPositionValue(event),
          nftId,
        });
        break;
      }
      
      case "COLLECT_FEES": {
        // Збір накопичених комісій — подія доходу
        const feeValueUSD = await getFeesValue(event, event.timestamp);
        taxEvents.push({
          type: TaxEventType.LIQUIDITY_FEES,
          token0: event.token0, fee0: event.amount0Collected,
          token1: event.token1, fee1: event.amount1Collected,
          valueUSD: feeValueUSD,
          timestamp: event.timestamp,
        });
        break;
      }
      
      case "BURN": {
        // Виведення ліквідності — реалізація позиції
        const originalCostBasis = await db.getLPCostBasis(nftId);
        const currentValue = await getPositionValue(event);
        
        taxEvents.push({
          type: TaxEventType.LP_BURN,
          gainLossUSD: currentValue - originalCostBasis,
          isLongTerm: isLongTerm(event.mintTimestamp, event.timestamp),
        });
        break;
      }
    }
  }
  
  return taxEvents;
}

Облік Yearn та yield vault

async function processYearnVaultOperations(tx: BlockchainTransaction): Promise<TaxableEvent[]> {
  // Депозит: ETH → yETH (акції)
  // Не opodatkovia при депозиті — як покупка акції
  
  // Виведення: yETH → ETH (більше ніж депозит через прибуток)
  // При виведенні: disposal yETH акцій, отримання ETH
  // Прибуток = поточна вартість ETH - оригінальна вартість ETH
  
  const withdrawLog = tx.logs.find(l => l.address === YEARN_VAULT_ADDRESS && l.topics[0] === WITHDRAW_TOPIC);
  
  if (withdrawLog) {
    const { shares, assets } = parseYearnWithdraw(withdrawLog);
    const costBasis = await db.getYearnSharesCostBasis(tx.from, YEARN_VAULT_ADDRESS, shares);
    const currentValue = assets * await priceService.getHistoricalPrice("ETH", tx.timestamp);
    
    return [{
      type: TaxEventType.DISPOSAL,
      assetSold: "yETH",
      amountSold: shares,
      proceeds: currentValue,
      costBasis: costBasis,
      gainLoss: currentValue - costBasis,
    }];
  }
  
  return [];
}

Підтримувані протоколи

Протокол Операції Складність
Uniswap V2/V3 Swap, LP додати/видалити, збір комісії Висока
Aave V2/V3 Supply, Borrow, Repay, Withdraw Середня
Compound cToken mint/redeem, проценти Середня
Curve Swap, додати/видалити ліквідність Середня
Yearn Vault депозит/виведення Середня
Lido stETH staking нагороди Висока (rebasing)
Convex CRV staking, вимогу нагород Висока

Стек

Компонент Технологія
Blockchain дані The Graph + Moralis + Alchemy
ABI декодування ethers.js / viem
Історія цін CoinGecko + Chainlink historical
Сховище PostgreSQL + TimescaleDB
Обробка BullMQ черги

Повна система обліку DeFi податків з підтримкою 10+ протоколів: 2-3 місяці розробки.