Skip to main content
When an LP deposits into a Lending Pool, they receive vTokens - share tokens that track their proportional claim on the pool. The vToken is the mechanism that makes yield passive.
vToken mechanics

The Core Idea: Shares

A vToken does not represent a fixed quantity of the underlying asset. It represents a proportional claim on the pool’s physical balance. Two values determine the exchange rate at any moment: The redemption rate (assets per vToken) is: assetsPerShare=pool_balancevToken supply\text{assetsPerShare} = \frac{\text{pool\_balance}}{\text{vToken supply}} When a borrower repays their debt plus accrued interest, pool_balance rises. vToken supply does not change. So assetsPerShare rises - and every vToken holder benefits proportionally, without doing anything.

How vTokens Are Minted and Burned

On deposit - the pool calculates shares to issue:
If the pool is empty or no vTokens have ever been minted, the first depositor receives shares 1:1. On redemption - the pool calculates assets to return:
Both operations use the same ratio: pool_balance / vToken supply. A depositor who supplies, waits, and then redeems gets back more than they put in - as long as at least one repayment with interest has occurred during that period.

When Does the Exchange Rate Rise?

The exchange rate rises when pool_balance grows. This happens when a borrower repays their debt.
  • Borrow: XLM leaves the pool. pool_balance drops. The exchange rate drops proportionally - but the LP’s total claim is unchanged, because the same XLM now exists as an outstanding loan.
  • Repayment: XLM returns to the pool. Since borrowers owe principal plus accrued interest, the interest portion is surplus. After repayment, pool_balance ends up higher than it was before the borrow, and assetsPerShare rises above the original level.
Interest accrues in the pool’s accounting (borrows_wad grows via update_state()), but this accounting does not affect pool_balance or the vToken exchange rate. The rate only moves when tokens physically enter or leave the pool contract.

A Worked Example

Suppose a pool starts empty and an LP deposits 1,000 XLM: The LP did nothing between the borrow and repayment. Their vToken balance stayed at 1,000 vXLM throughout. Once the borrower repaid with interest, the exchange rate rose from 1.000 to 1.010. During the active borrow, the LP’s redeemable amount reflects only the liquid portion of the pool. The outstanding 500 XLM is an active loan - the LP’s full claim is restored once the borrower repays. If utilization is high, full redemptions may be temporarily limited. A second LP depositing 100 XLM at the end would receive 100 / 1.010 ≈ 99.01 vXLM - they enter at the current exchange rate, fairly priced against the original LP.

vToken Operations

What vTokens Are Not

A vToken is not:
  • A fixed-yield bond. Yield depends on what borrowers repay, which varies with utilization and the Rate Model.
  • Risk-free. If a borrower defaults and liquidation does not recover the full debt, pool_balance receives less than the full repayment. The shortfall reduces the exchange rate permanently - LPs absorb it proportionally.
  • Always redeemable. If pool utilization is near 100%, most assets are out as active loans. Redemptions may fail until borrowers repay. This is a liquidity constraint, not a solvency problem - the debt is still tracked and will return to the pool.
  • A governance token. vTokens carry no voting rights. They are purely economic claims on the pool.

Transferability

vTokens are standard fungible tokens with transfer and transfer_from functions. They can be sent to another address, which then holds the same proportional claim on the pool. Vanna does not restrict transfers.

Supported Assets

Vanna currently deploys two vToken contracts on Stellar: