reserve-protocol / protocol

Permissionless asset-backed, yield-bearing & overcollateralized stablecoins on Ethereum
Other
142 stars 103 forks source link

Reserve Protocol

The Reserve Protocol enables a class of token called RToken: self-issued tokens backed by a rebalancing basket of collateral. While the protocol enables any number of RTokens to be created, further discussion is limited to the characterization of a single RToken instance.

Overview

RTokens can be minted by depositing a basket of collateral tokens, and redeemed for the basket as well. Thus, an RToken will tend to trade at the market value of the entire basket that backs it, as any lower or higher price could be arbitraged.

The definition of the issuance/redemption basket is set dynamically on a block-by-block basis with respect to a reference basket. While the RToken often does its internal calculus in terms of a single unit of account (USD), what constitutes appreciation is entirely a function of the reference basket, which is a linear combination of reference units.

RTokens can be over-collateralized, which means that if any of their collateral tokens default, there's a pool of value available to make up for the loss. RToken over-collateralization is provided by Reserve Rights (RSR) holders, who may choose to stake their RSR on an RToken instance. Staked RSR can be seized in the case of a default, in a process that is entirely mechanistic based on on-chain price-feeds, and does not depend on governance votes or human judgment.

But markets do not over-collateralize holders for free. In order to incentivize RSR holders to stake in an RToken instance, each RToken instance can choose to offer an arbitrary portion of its revenue to be directed towards its RSR over-collateralization pool. This encourages staking in order to provision over-collateralization.

As with any smart contract application, the actual behavior may vary from the intended behavior. It's safest to observe an application in use for a long period of time before trusting it to behave as expected. This overview describes its intended behavior.

For a much more detailed explanation of the economic design, including an hour-long explainer video (!) see the Reserve website.

Further Documentation

Mainnet Addresses (v3.4.0)

Implementation Contracts Address
tradingLib 0xa54544C6C36C0d776cc4F04EBB847e0BB3A11ea2
facade 0x2C7ca56342177343A2954C250702Fd464f4d0613
facadeWriteLib 0xDf73Cd789422040182b0C24a8b2C97bbCbba3263
facadeWrite 0x1D94290F82D0B417B088d9F5dB316B11C9cf220C
deployer 0x2204EC97D31E2C9eE62eaD9e6E2d5F7712D3f1bF
rsrAsset 0x591529f039Ba48C3bEAc5090e30ceDDcb41D0EaA
main 0x24a4B37F9c40fB0E80ec436Df2e9989FBAFa8bB7
gnosisTrade 0x030c9B66Ac089cB01aA2058FC8f7d9baddC9ae75
dutchTrade 0x971c890ACb9EeB084f292996Be667bB9A2889AE9
assetRegistry 0xbF1C0206de440b2cF76Ea4405e1DbF2fC227a463
backingManager 0x20C801869e578E71F2298649870765Aa81f7DC69
basketHandler 0xeE7FC703f84AE2CE30475333c57E56d3A7D3AdBC
broker 0x62BD44b05542bfF1E59A01Bf7151F533e1c9C12c
distributor 0x44a42A0F14128E81a21c5fc4322a9f91fF83b4Ee
furnace 0x845B8b0a1c6DB8318414d708Da25fA28d4a0dc81
rsrTrader 0xc60a7Cd6fce24d0c3637A1dCBC8B0f9A9BFF6a7c
rTokenTrader 0xc60a7Cd6fce24d0c3637A1dCBC8B0f9A9BFF6a7c
rToken 0x784955641292b0014BC9eF82321300f0b6C7E36d
stRSR 0xE433673648c94FEC0706E5AC95d4f4097f58B5fb

The DeployerRegistry, which contains a link to all official releases via their Deployer contracts, can be found here.

Deployed collateral plugin addresses and their configuration parameters can be found here.

Parallel Prototypes

We have a p0 and p1 implementation for each contract in our core system. The p0 version is our specification prototype, and is intended to be as easy as possible to understand. The p1 version should behave identically, except that it employs substantial optimizations and more complicated algorithms in order to achieve lower gas costs.

We implement and maintain both of these systems in the name of correctness. Implementing p0 helps us to specify the exact intended behavior of the protocol without needing to deal simultaneously with gas optimization; maintaining equivalent behavior of both serves as a substantial extra form of testing. The behavior of each contract in p1 should be identical to the behavior of the corresponding contract in p0, so we can perform differential testing between them - checking that they behave identically, both in our explicit tests and in arbitrary randomized tests.

We thought p0 and p1 would end up being a lot more different than they ended up being. For the most part the contracts only really differ for StRSR.sol, and a little for RToken.sol.

Properties of P0

P0 implements our "abstract" economic protocol; it should have equivalent observable behavior to P1, but be expressed just as clearly as we can manage it in Solidity. In several places, we achieve that clarity by forgoing any attempt to be realistic to deploy to Ethereum.

Properties of P1

P1 is the production version of the economic protocol.

Repository Structure

contracts holds our smart contracts:

test holds our Typescript system tests, driven through Hardhat.

The less-central folders in the repository are dedicated to project management, configuration, and other ancillary details:

Types of Tests

Unit/System Tests

Target: Full branch coverage, and testing of any semantically-relevant situations

End-to-End Tests

Target: Each integration we plan to deploy behaves correctly under all actually-anticipated scenarios.

Property Testing

Located in fuzz branch only.

Target: The handful of our most depended-upon system properties and invariants are articulated and thoroughly fuzz-tested. Examples of such properties include:

Contributing

If you would like to contribute, you'll need to configure a secret in your fork repo in order for our integration tests to pass in CI. The name of the secret should ALCHEMY_MAINNET_KEY and it should be equal to the suffix portion of the full URL.

Usage: https://eth-mainnet.alchemyapi.io/v2/${{ secrets.ALCHEMY_MAINNET_KEY }}

To get setup with tenderly, install the tenderly cli. and login with tenderly login --authentication-method access-key --access-key {your_access_key} --force.

Responsible Disclosure

See: Immunefi

External Documentation

Video overview