NAV Calculation System for Crypto Funds

The NAV formula looks simple: (assets minus liabilities) divided by the number of shares. But for a crypto fund, each component is a challenge. Asset prices change every second, part of the funds are locked in DeFi protocols, liabilities include accrued fees, and the share count changes with investo

Blockchain Development Services

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1452
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1310
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    1005
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1270
  • image_logo-advance_0.webp
    B2B Advance company logo design
    719
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    1012

The NAV formula looks simple: (assets minus liabilities) divided by the number of shares. But for a crypto fund, each component is a challenge. Asset prices change every second, part of the funds are locked in DeFi protocols, liabilities include accrued fees, and the share count changes with investor subscriptions and redemptions. A system that recalculates NAV once a day using CoinGecko data is not suitable for a regulated fund. We build architecture that withstands audits and operates in real time. One of our clients experienced a situation where, due to using a single price source, their NAV diverged from the actual portfolio value by 12% — leading to rebalancing and loss of investor trust. We solved this by implementing a multi-level oracle. Based on years of experience: over 8 years in blockchain development, dozens of implemented projects for crypto funds.

Choosing Price Sources for NAV

Selecting a price source is a methodological question with technical implications. Consider three categories:

  • Centralized exchange (CEX) prices: Binance, Coinbase, Kraken APIs provide real-time prices with latency < 100 ms. Issues: rate limits, price discrepancies between exchanges, risk of manipulation on low-liquidity pairs, uptime dependency. For official NAV (T-1 or T-0), we use VWAP over the last 1–4 hours from top-3 exchanges:
def calculate_vwap(trades: List[Trade], window_hours: int = 1) -> Decimal: cutoff = datetime.utcnow() - timedelta(hours=window_hours) recent = [t for t in trades if t.timestamp >= cutoff] total_volume = sum(t.volume for t in recent) if total_volume == 0: return recent[-1].price if recent else Decimal('0') return sum(t.price * t.volume for t in recent) / total_volume 
  • On-chain oracle prices: Chainlink Price Feeds — decentralized oracles with aggregation from professional providers. Updated on deviation > 0.5% or once per hour. For on-chain NAV calculation, this is the only acceptable option. Uniswap V3 TWAP — Time-Weighted Average Price from observation buffer, resistant to flash loans but vulnerable to prolonged manipulation.

  • Composited pricing pipeline: For production funds, we use a multi-tier scheme:

Tier Source Switch Condition
Primary Chainlink / CoinGecko Working, data fresh
Fallback 1 CEX VWAP (Binance+Coinbase+Kraken) Primary unavailable or stale
Fallback 2 On-chain TWAP (Uniswap V3, 30 min) Fallback 1 unavailable
Stale Last known price + flag Manual override mandatory

Reliability comparison: Chainlink Oracle is 10x more reliable than a single exchange API, as it aggregates data from multiple independent nodes.

How to Set Up a Multi-Tier Price Scheme? Step-by-Step Guide

  1. Identify the base asset and list of secondary assets.
  2. Connect Chainlink Price Feeds for major pairs (ETH/USD, BTC/USD).
  3. Set up fallback streams: VWAP from Binance, Coinbase, Kraken.
  4. Implement on-chain TWAP for low-liquidity pairs.
  5. Add monitoring for stale data and a manual override mechanism.
  6. Test correctness under stress scenarios (sudden volatility, exchange outage).

How to Account for DeFi Positions in NAV?

This is the most complex part for a crypto fund with an active DeFi strategy. Assets can be simultaneously in Uniswap V3 liquidity positions, Aave as collateral, lending positions (debt), staking with lock-up, Curve/Convex as LP tokens. Each type requires a separate calculator.

Uniswap V3 Positions

NFT with variable value depending on price and range:

async function getUniswapV3PositionValue( positionId: number, priceUSD: Record<string, number> ): Promise<number> { const position = await positionManager.positions(positionId); const pool = await getPool(position.token0, position.token1, position.fee); const { amount0, amount1 } = getAmountsForLiquidity( pool.sqrtPriceX96, getSqrtRatioAtTick(position.tickLower), getSqrtRatioAtTick(position.tickUpper), position.liquidity ); // Plus accumulated fees const { fees0, fees1 } = await collectableFees(positionId); return ( (amount0 + fees0) * priceUSD[position.token0] + (amount1 + fees1) * priceUSD[position.token1] ); } 

Aave positions: data via getUserAccountData returns totalCollateralBase, totalDebtBase, health factor. Net position = collateral - debt.

Management Fees and High Water Mark

Typical hedge fund structure — 2/20: 2% annual management fee on NAV (accrued daily), 20% performance fee on growth above High Water Mark (HWM). Accrued fees are fund liabilities and reduce NAV.

Fee Type Amount Accrual Frequency
Management fee 2% annual Daily (1/365)
Performance fee 20% of growth above HWM Monthly/Quarterly
class NAVCalculator: def calculate_daily_management_fee(self, nav: Decimal, date: date) -> Decimal: daily_rate = Decimal('0.02') / Decimal('365') return nav * daily_rate def calculate_performance_fee( self, current_nav_per_share: Decimal, high_water_mark: Decimal ) -> Decimal: if current_nav_per_share <= high_water_mark: return Decimal('0') gain_above_hwm = current_nav_per_share - high_water_mark return gain_above_hwm * Decimal('0.20') 

Why is a Multi-Oracle Approach Important?

Using a single price source is the main cause of NAV discrepancies. The multi-oracle approach reduces the risk of manipulation and data unavailability. In practice, we implement a triple-source pipeline that automatically switches based on latency and staleness. This increases uptime reliability to 99.9%.

How to Avoid Errors in NAV Calculation?

Typical errors: ignoring accrued fees, incorrect valuation of Uniswap V3 positions (not accounting for range), lack of manual override mechanism for oracle failure, incorrect HWM handling during share splits. For each case, we prepare a checklist and automated tests.

Subscriptions and Redemptions

Investor entry and exit require atomic operations. T+0: request, T+1: official NAV and issuance/redemption of shares. The registry can be on-chain (ERC-1400) or off-chain. We provide a flexible system with KYC/AML modules.

Audit and Reconciliation

Daily NAV must be reproducible. All data — prices, positions, fees — are stored in snapshots. The fund's independent administrator must have access to raw data. Discrepancy > 0.1% requires investigation. We conduct formal verification of calculation models using smart contracts.

What's Included in the Work

  • Analysis and architecture design for price collection and calculations
  • Development of data collection layer (Go) and NAV engine (Python)
  • Adaptation to your asset structure (including custom DeFi protocols)
  • Integration with share registry and accounting
  • Dashboard and reporting (React + REST)
  • Documentation, team training, warranty support

Timeline and How to Start

Development of a system for a fund with 10–20 assets and basic DeFi positions — 8–12 weeks. Complex strategies — up to 16 weeks. Cost is calculated individually after an audit of your portfolio. Contact us for a consultation — we will prepare a detailed proposal. Get an estimate for your project now: we guarantee transparent reporting and quality work.