Ribbon Finance
  • Introduction to Ribbon Finance
  • Aevo
  • FAQ
    • General
    • DOV Deposits
    • DOV Withdrawals
    • DOV Trading and options
    • Ribbonomics
  • Dune dashboards
  • Contribute
  • Security
  • Ribbon Theta Vaults
    • Introduction to Theta Vaults
      • Strike Selection and Expiry
      • Options Architecture
      • Options Settlement
      • Auctions
      • Risk profile
      • Fees
    • Theta vaults architecture
    • User guides
      • How to deposit
      • How to withdraw
      • How to pause and resume
      • How to stake, unstake vault shares and claim rewards
      • How to transfer vault positions
      • How to participate in Paradigm Auctions
      • How to redeem oTokens
  • RIBBON EARN
    • Introduction to Ribbon Earn
    • Ribbon Earn USDC
      • Risk-Free Rate
      • Twin win strategy
      • Vault specifications
      • Eligibility
      • Fees
    • Ribbon Earn stETH
      • What is a dolphin strategy?
      • Vault specifications
      • Risk profile
      • Fees
  • RIBBON LEND
    • Introduction to Ribbon Lend
      • Yields from unsecured lending
      • No lockups
        • Pool status
        • Default
      • Off-chain enforcement / credit underwriting
      • Built-in insurance
      • Fees
  • ribbon treasury
    • Introduction to Ribbon Treasury
      • Why Ribbon Treasury?
      • Partners
      • How to get involved
  • Ribbonomics
    • Overview and RBN tokenomics
      • Vote-Escrowed RBN
      • Fee Collection and Distribution
      • Liquidity Gauges and RBN Emissions
      • Gauge Weight Voting
      • Bribes
        • Guide to Boost Bribing
          • For Bribers
          • For veRBN Holders
      • Upgrades
    • How to lock RBN, boost and claim protocol revenues
  • Developers
    • Deployed Contracts
    • Ribbon Subgraph
Powered by GitBook
On this page
  • Implementation Details
  • Gauge Types
  • LiquidityGauge

Was this helpful?

  1. Ribbonomics
  2. Overview and RBN tokenomics

Liquidity Gauges and RBN Emissions

PreviousFee Collection and DistributionNextGauge Weight Voting

Last updated 3 years ago

Was this helpful?

Ribbon incentivizes vault depositors with RBN, the protocol governance token. Allocation, distribution and emission of RBN are managed via several related DAO contracts:

  • LiquidityGauge: Measures vault tokens (i.e. rETH-THETA) provided by users over time, in order to distribute RBN and other rewards

  • GaugeController: Central controller that maintains a list of gauges, weights and type weights, and coordinates the rate of RBN production for each gauge

  • Minter: RBN emission contract, sends non-circulating RBN into circulation via liquidity gauges

Implementation Details

RBN Emissions

RBN follows a constant inflation schedule of 250,000 RBN per week rewarded to vault depositors over the course of 6 months. This is ~6.5 M RBN overall, or 0.65% of total supply. This is subject to changes before the 6 months have elapsed. We will officially revisit this inflation schedule after the 6 months.

Liquidity Gauges

Emissions are directed to users who deposit into the protocol option selling vaults. This usage is measured via “Liquidity Gauge” contracts. Each pool has an individual liquidity gauge. The maintains a list of gauges and their types, with the weights of each gauge and type.

To measure liquidity over time, the user deposits their vault tokens into the liquidity gauge. Coin rates which the gauge is getting depends on current emission rate, gauge weight, and gauge type weights. Each user receives a share of newly emitted RBN proportional to the amount of vault tokens locked. Additionally, rewards may be boosted by up to factor of 2.5 if the user vote-locks tokens for Ribbon governance in the contract.

Suppose we have the constant emission rate 𝑟𝑟r, gauge weight 𝑤g𝑤gwg and gauge type weight 𝑤𝑡𝑤𝑡wt. Then, all the gauge handles the stream of inflation with the rate 𝑟′=𝑤𝑔∗𝑤𝑡∗𝑟𝑟′=𝑤𝑔*𝑤𝑡*𝑟r′=wg∗wt∗r which it can update every time 𝑤𝑔,𝑤𝑡𝑤𝑔,𝑤𝑡wg,wt, or mining epoch changes.

To calculate a user’s share of 𝑟′𝑟′r′, we must calculate the integral: $𝐼𝑢=∫(𝑟′(𝑡)𝑏𝑢(𝑡)/𝑆(𝑡))𝑑𝑡 where 𝑏𝑢(𝑡)𝑏𝑢(𝑡)bu(t) is the balance supplied by the user (measured in vault tokens) and 𝑆(𝑡)𝑆(𝑡)S(t) is total deposits supplied by users, depending on the time 𝑡𝑡t; the value 𝐼𝑢𝐼𝑢Iu gives the amount of tokens which the user has to have emitted to them. The user’s balance 𝑏𝑢𝑏𝑢bu changes every time the user $𝑢 makes a deposit or withdrawal, and 𝑆𝑆S changes every time _any_ user makes a deposit or withdrawal (so $𝑆 can change many times in between two events for the user 𝑢"𝑢"u". In the liquidity gauge contract, the value of 𝐼𝑢𝐼𝑢Iu is recorded per-user in the public integrate_fraction mapping.

To avoid requiring that all users to checkpoint periodically, we keep recording values of the following integral (integrated over 0 -> t) (named integrate_inv_supply in the contract):

$𝐼𝑖𝑠(𝑡)=∫(𝑟′(𝑡)/𝑆(𝑡))𝑑t

The value of 𝐼𝑖𝑠𝐼𝑖𝑠Iis is recorded at any point any user deposits or withdraws, as well as every time the rate 𝑟′𝑟′r′ changes (either due to weight change or change of mining epoch).

Boosting

If no users vote-lock any RBN (or simply don’t have any), the inflation will simply be distributed proportionally to the liquidity 𝑏𝑢𝑏𝑢bu each one of them provided. However, if a user stakes enough RBN, they are able to boost their stream of RBN by up to factor of 2.5 (reducing it slightly for all users who are not doing that).

Implementation details are such that a user gets the boost at the time of the last action or checkpoint. Since the voting power decreases with time, it is favorable for users to apply a boost and do no further actions until they vote-lock more tokens. However, once the vote-lock expires, everyone can “kick” the user by creating a checkpoint for that user and, essentially, resetting the user to no boost if they have no voting power at that point already.

Gauge Weight Voting

Users can allocate their veRBN towards one or more liquidity gauges. Gauges receive a fraction of newly minted RBN tokens proportional to how much veRBN the gauge is allocated. Each user with a veRBN balance can change their preference at any time.

When a user applies a new weight vote, it gets applied at the start of the next epoch week. The weight vote for any one gauge cannot be changed more often than once in 10 days.

The Gauge Controller

The “Gauge Controller” maintains a list of gauges and their types, with the weights of each gauge and type. In order to implement weight voting, GaugeController has to include parameters handling linear character of voting power each user has.

GaugeController records points (bias + slope) per gauge in vote_points, and _scheduled_ changes in biases and slopes for those points in vote_bias_changes and vote_slope_changes. New changes are applied at the start of each epoch week.

Per-user, per-gauge slopes are stored in vote_user_slopes, along with the power the user has used and the time their vote-lock ends.

The totals for slopes and biases for vote weight per gauge, and sums of those per type, are scheduled / recorded for the next week, as well as the points when voting power gets to 0 at lock expiration for some of users.

When a user changes their gauge weight vote, the change is scheduled for the next epoch week, not immediately. This reduces the number of reads from storage which must to be performed by each user: it is proportional to the number of weeks since the last change rather than the number of interactions from other users.

Gauge Types

Each liquidity gauge is assigned a type within the gauge controller. Grouping gauges by type allows the DAO to adjust the emissions according to type, making it possible to e.g. end all emissions for a single type.

Currently active gauge types are as follows:

  • Vault (all Ethereum vaults): 0

LiquidityGauge

In order to incentivize users to participate in governance, and additionally create stickiness for liquidity, we implement the following mechanism. A user’s balance, counted in the liquidity gauge, gets boosted by users locking RBN tokens in contract, depending on their vote weight 𝑤𝑖wi𝑤𝑖wiwiwi: 𝑏𝑢∗=min(0.4𝑏𝑢+0.6𝑆∗𝑤𝑖/𝑊,𝑏𝑢)𝑏𝑢*=min(0.4𝑏𝑢+0.6𝑆*𝑤𝑖/𝑊,𝑏𝑢)bu∗=min(0.4bu+0.6S∗wi/W,bu) The value of 𝑤𝑖𝑤𝑖wi is taken at the time the user performs any action (deposit, withdrawal, withdrawal of emitted RBN tokens) and is applied until the next action this user performs.

RBN lockers can delegate their boost to other addresses and in return earn yield through .

RBN lockers can vote for particular gauges and in return earn yield through .

Each pool has a unique liquidity gauge. Deployment addresses can be found in the section of the documentation.

There are several versions of liquidity gauge contracts in use. Source code for these contracts is available on .

For more details, please visit .

Voting Escrow
bribes
bribes
addresses reference
Github
curve docs
Voting Escrow
Gauge Controller
Imgur