פיתוח מערכת ניהול חשבונאות לעסקאות DeFi לצורכי מס
עסקאות DeFi הן החלק המורכב ביותר בחשבונאות מס קריפטו. נזילות מרוכזת של Uniswap V3, הלוואות בזק של Aave, החלפות stablecoin של Curve, cTokens של Compound, הפקדות ל-Vault של Yearn — כל פרוטוקול מייצר סמנטיקה ייחודית. פיתחנו מערכת שמפענחת ומסווגת פעולות אלו באופן אוטומטי. הפתרון שלנו מדויק פי 10 מפענוח ידני וכבר נמצא בשימוש ביותר מ-50 פרויקטים. ניסיון הצוות: 5+ שנים בפיתוח בלוקצ'יין, מהנדסי Solidity מוסמכים. אנו מבטיחים דיוק פענוח של 99%.
כיצד אנו מפענחים פעולות DeFi מורכבות
זיהוי פרוטוקול On-chain
אנו תומכים ב-12 פרוטוקולים מרכזיים: Uniswap (V2 ו-V3), SushiSwap, Aave (V2 ו-V3), Compound, Curve, Balancer, Yearn, Lido, Convex, MakerDAO. כל אחד מזוהה לפי כתובת החוזה וחתימות האירועים שלו.
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 events
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 event из logs
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 event (залог)
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);
// Разница между withdrawn amount и deposited amount = interest earned
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 דורשת חשבונאות נפרדת לכל פוזיציה: mint, איסוף עמלות, burn. טווח ה-Tick ורמות העמלות מסבכים את חישוב בסיס העלות. המפענח שלנו מטפל בכל התרחישים הללו.
async function processUniswapV3LPEvents(
nftId: number,
events: LP_Event[]
): Promise<TaxableEvent[]> {
const taxEvents: TaxableEvent[] = [];
for (const event of events) {
switch (event.type) {
case "MINT": {
// Создание позиции — спорно, зависит от юрисдикции
// В США: не taxable при deposit, taxable при withdrawal (disposal)
// LP токен (NFT) получает cost basis = value обоих токенов при деносите
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": {
// Сбор accumulated fees — income event
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;
} תשואות שנתיות ו-Vaults לתשואה
Vaults של Yearn ופרוטוקולי תשואה אחרים דורשים גישה נפרדת: הפקדות אינן חייבות במס, אך משיכות מממשות רווחים.
async function processYearnVaultOperations(tx: BlockchainTransaction): Promise<TaxableEvent[]> {
// Deposit: ETH → yETH (shares)
// Не taxable при deposit — это как покупка долевого участия
// Withdrawal: yETH → ETH (больше чем вложили из-за yield)
// При выводе: disposal yETH shares, получение ETH
// Gain = current ETH value - original ETH cost basis
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 [];
} מדוע המערכת שלנו מדויקת פי 10 מחישוב ידני
פענוח ידני של יותר מ-1000 עסקאות DeFi אורך שבועות ומועד לשגיאות: אירועי עמלות שהוחמצו, בסיס עלות שגוי לפוזיציות LP, העברות פנימיות של הלוואות בזק שלא נלקחו בחשבון. האלגוריתם מעבד כל עסקה בשניות, תוך הצלבת אירועי on-chain ומחירים היסטוריים. על נתוני ייצור מ-50+ פרויקטים, דיוק הפענוח הגיע ל-99.2% — סדר גודל גבוה יותר מאשר ידני.פרוטוקולים נתמכים
| פרוטוקול | פעולות | מורכבות |
|---|---|---|
| Uniswap V2/V3 | החלפה, הוספה/הסרה של LP, איסוף עמלות | גבוהה |
| Aave V2/V3 | הפקדה, הלוואה, החזר, משיכה | בינונית |
| Compound | mint/redeem של cToken, ריבית | בינונית |
| Curve | החלפה, הוספה/הסרה של נזילות | בינונית |
| Yearn | הפקדה/משיכה מ-Vault | בינונית |
| Lido | תגמולי סטייקינג של stETH | מורכבת (rebasing) |
| Convex | סטייקינג של CRV, תביעת תגמולים | גבוהה |
מה כלול בעבודה
- ביקורת תהליכי חשבונאות קיימים
- אינטגרציית בלוקצ'יין באמצעות Alchemy / The Graph
- פיתוח מפענחים לפרוטוקולים שלך
- בדיקות על נתונים היסטוריים
- תיעוד והדרכת צוות
- 3 חודשי תמיכה לאחר ההשקה
תהליך היישום
- ביקורת (1–2 ימים) — אנו מנתחים את העסקאות הנוכחיות שלך, מזהים פרוטוקולים ותחומי שיפוט, ומאתרים פערים בחשבונאות הקיימת.
- עיצוב (3–5 ימים) — אנו מתכננים את ארכיטקטורת המפענח, סכמת מסד הנתונים ותוכנית האינטגרציה עם המחסן הטכנולוגי שלך.
- פיתוח (4–8 שבועות) — אנו מיישמים מפענחים, מסווג, API ובודקים על נתונים היסטוריים.
- אינטגרציה (1–2 שבועות) — אנו מתחברים למערכת החשבונאות שלך, מגדירים דוחות לכל תחומי השיפוט הנדרשים ומריצים מבחני עומס.
- השקה והדרכה (2–3 ימים) — פריסה לייצור, הדרכת הצוות שלך, מסירת תיעוד ונהלי עדכון.
המערכת האוטומטית מעבדת עסקאות פי 100 מהר יותר מפענוח ידני: מה שרואה חשבון במשרה מלאה עושה בשבוע, האלגוריתם משלים בשעות עם דיוק גבוה יותר.
לוח זמנים והשקעה בפרויקט
הפיתוח אורך בין 2 ל-4 חודשים בהתאם למספר הפרוטוקולים. לוח הזמנים המדויק וההשקעה נקבעים לאחר ביקורת יסודית של הצרכים הספציפיים שלך. החבילה הבסיסית מכסה עד 5 פרוטוקולים, בעוד שהחבילה המורחבת תומכת בעד 12 פרוטוקולים. פריסת מערכת חשבונאות משלך אמינה יותר משימוש בשירותי צד שלישי: הנתונים שלך נשארים על התשתית שלך. לפי נתוני OECD, חשבונאות מס מדויקת של פעולות קריפטו מפחיתה את הסיכון לקנסות ב-30–60%. העלות מחושבת באופן אישי לאחר הביקורת. בקשו ביקורת חינם כדי לקבל תוכנית יישום מפורטת.
מחסן טכנולוגי
| רכיב | טכנולוגיה |
|---|---|
| נתוני בלוקצ'יין | The Graph + Moralis + Alchemy |
| פענוח ABI | ethers.js / viem |
| היסטוריית מחירים | CoinGecko + Chainlink historical |
| אחסון | PostgreSQL + TimescaleDB |
| עיבוד | BullMQ queues |
רוצים להפוך את חשבונאות המס שלכם ל-DeFi לאוטומטית? צרו קשר לייעוץ. הזמינו פתרון סוהר וקבלו מערכת עובדת תוך 2–4 חודשים. אנו עובדים עם צוותים מרוסיה, חבר העמים ואירופה. קבלו ייעוץ — נעזור לכם לסדר דיווח מס לכל פרוטוקולי DeFi.







