Spark TVL **- What metric do we want to obtain?** The Total Value Locked (TVL) expressed in USD for each star and/or partner. **- Do we understand what this metric is?** In simple terms, every user-supplied token that remains locked inside its contracts, whether the depositor’s goal was yield, collateral, or both. **- What information do we need? contracts, wallets, etc.** - PoolAddressesProvider (`0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE`): Single source of truth; points to the live Pool, Data-Provider and Price-Oracle proxies - ProtocolDataProvider (Aave v3 fork): Exposes reserve list, scaled supply, debt totals, and liquidity index using the ABIs `getAllReservesTokens()`, and `getReserveData(asset)`. - AaveOracle (`0x8105f69D9C41644c6A0803fDA7D03Aa70996cFD9`): On-chain USD price for every underlying asset using the ABI getAssetPrice(asset). **- How do we calculate this metric?** - Discover active components (per chain): ``` provider = IPoolAddressesProvider(PROVIDER_ADDR) dataProv = provider.getPoolDataProvider() oracle = provider.getPriceOracle() ``` - Enumerate every reserve in Spark Lend: Call getAllReservesTokens() once; loop through the returned list of underlying tokens. - Convert each reserve’s scaled supply into real token units: ``` scaledSupply, liquidityIndex = getReserveData(token).supply, .liquidityIndex underlyingAmount = scaledSupply × liquidityIndex ÷ 1e27 ``` - Mark to USD ``` USD value = underlyingAmount × oracle.getAssetPrice(token) ÷ 1e18. (Spark follows the Aave-v3 convention: oracle prices are “price in ETH-wei where 1 ETH = $1”.) ``` - Sum across all reserves to get the Spark Lend TVL for that chain. Borrowed coins are not counted: they left the Pool contract and therefore have zero balance. - Add the Savings-vault layer: ``` assets = IERC4626(V).totalAssets() // underlying token units usdValue = assets × oracle.getAssetPrice(underlying) ÷ 1e18 TVL += usdValue ``` These vault balances are the deposits that earn the Sky/Spark Savings Rate [see docs](https://docs.spark.fi/user-guides/spark-liquidity-layer) - Repeat steps 1-6 for every supported network (Ethereum, Base, Gnosis, Arbitrum) and add the subtotals. - Return / display the grand total. **- What will be the cron job endpoint to update this metric in database and with which frequency?** - `/api/cron/update-tvl?protocol=[protocol]` `protocol` can be a star, a partner, or any protocol we want to calculate TVL. - This cron job should be executed as frequently as possible, every 10 minutes is a good start. **- What will be the endpoint/s to consume this metric in the clients?** - `/api/tvl/[protocol]` `protocol` can be a star, a partner, or any protocol we want to calculate TVL.