Coder Social home page Coder Social logo
Reserve photo

reserve-protocol Goto Github PK

repos: 45.0 gists: 0.0

Name: Reserve

Type: Organization

Bio: Reserve is a digital currency with stable, real-world value that helps scale prosperity by enabling everyone to protect and use their money globally.

Blog: reserve.org

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

  • Development Environment: Setup and usage of our dev environment. How to compile, autoformat, lint, and test our code.
    • Testing with Echidna: Notes so far on setup and usage of Echidna (which is decidedly an integration-in-progress!)
    • Deployment: How to do test deployments in our environment.
  • System Design: The overall architecture of our system, and some detailed descriptions about what our protocol is intended to do.
  • Pause and Freeze States: An overview of which protocol functions are halted in the paused and frozen states.
  • Deployment Variables A detailed description of the governance variables of the protocol.
  • Our Solidity Style: Common practices, details, and conventions relevant to reading and writing our Solidity source code, especially where those go beyond standard practice.
  • Writing Collateral Plugins: An overview of how to develop collateral plugins and the concepts / questions involved.
  • Building on Top: How to build on top of Reserve, including information about long-lived fork environments.
  • MEV: A resource for MEV searchers and others looking to interact with the deployed protocol programmatically.
  • Rebalancing Algorithm: Description of our trading algorithm during the recollateralization process
  • Changelog: Release changelog

Mainnet Addresses (v3.0.0)

Implementation Contracts Address
tradingLib 0xB81a1fa9A497953CEC7f370CACFA5cc364871A73
facadeRead 0x81b9Ae0740CcA7cDc5211b2737de735FBC4BeB3C
facadeAct 0x801fF27bacc7C00fBef17FC901504c79D59E845C
facadeWriteLib 0x0776Ad71Ae99D759354B3f06fe17454b94837B0D
facadeWrite 0x41edAFFB50CA1c2FEC86C629F845b8490ced8A2c
deployer 0x15480f5B5ED98A94e1d36b52Dd20e9a35453A38e
rsrAsset 0x7edD40933DfdA0ecEe1ad3E61a5044962284e1A6
main 0xF5366f67FF66A3CefcB18809a762D5b5931FebF8
gnosisTrade 0xe416Db92A1B27c4e28D5560C1EEC03f7c582F630
dutchTrade 0x2387C22727ACb91519b80A15AEf393ad40dFdb2F
assetRegistry 0x773cf50adCF1730964D4A9b664BaEd4b9FFC2450
backingManager 0x0A388FC05AA017b31fb084e43e7aEaFdBc043080
basketHandler 0x5ccca36CbB66a4E4033B08b4F6D7bAc96bA55cDc
broker 0x9A5F8A9bB91a868b7501139eEdB20dC129D28F04
distributor 0x0e8439a17bA5cBb2D9823c03a02566B9dd5d96Ac
furnace 0x99580Fc649c02347eBc7750524CAAe5cAcf9d34c
rsrTrader 0x1cCa3FBB11C4b734183f997679d52DeFA74b613A
rTokenTrader 0x1cCa3FBB11C4b734183f997679d52DeFA74b613A
rToken 0xb6f01Aa21defA4a4DE33Bed16BcC06cfd23b6A6F
stRSR 0xC98eaFc9F249D90e3E35E729e3679DD75A899c10

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.

  • Optimized for obviousness and clarity of expression
  • No constraints on execution speed or gas costs
  • State is fully normalized whenever practical

Properties of P1

P1 is the production version of the economic protocol.

  • Upgradable
  • Optimized for gas costs
  • No function call needs more than O(lg N) time or space, and it's O(1) where possible.
    • Caveat: a function might be O(k), where k is the number of registered Assets or Collateral tokens; however, we take great care to make those loops efficient, and to avoid O(k^2) behavior!
  • No user is ever forced to pay gas to process other users' transactions.

Repository Structure

contracts holds our smart contracts:

  • p0 and p1 each contain an entire implementations of our core protocol. p0 is as easy as possible to understand; p1 is our gas-efficient system to deploy in production.
  • The core protocol requires a plugin contract for each asset it handles and each auction platform it can use. plugins contains our initial implementations of these (plugins/assets, plugins/trading), as well as mock implementations of each asset and auction platform that we're using for testing purposes (plugins/mocks).
  • interfaces contains the contract interfaces for all of those implementations.

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:

  • Most of the top-level files are various forms of project-level configuration
  • common: Shared utility types, methods, and constants for testing in TypeScript
  • tasks: Hardhat tasks
  • scripts: Hardhat scripts
  • types: Typescript annotations; currently just export interface Address {}

Types of Tests

Unit/System Tests

  • Driven by hardhat test
  • Addressed by yarn test:unit
  • Checks for expected behavior of the system.
  • Can run the same tests against both p0 and p1
  • Uses contract mocks, where helpful to predict component behavior

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

End-to-End Tests

  • Driven by hardhat test
  • Addressed by yarn test:integration
  • Uses mainnet forking
  • Can run the same tests against both p0 and p1
  • Tests all needed plugin contracts, contract deployment, any migrations, etc.
  • Mock out as little as possible; use instances of real contracts

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

Property Testing

Located in fuzz branch only.

  • Driven by Echidna
  • Asserts that contract invariants and functional properties of contract implementations hold for many executions
  • Particular tests may be either particular to p0, particular to p1, or generic across both (by relying only on their common interface)

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

  • Unless the basket is switched (due to token default or governance) the protocol always remains fully-collateralized.
  • Unless the protocol is frozen, RToken holders can always redeem

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

Reserve's Projects

0x-monorepo icon 0x-monorepo

0x protocol monorepo - includes our smart contracts and many developer tools

brownie icon brownie

A Python-based development and testing framework for smart contracts targeting the Ethereum Virtual Machine.

contract-metadata icon contract-metadata

A mapping of ethereum contract addresses to broadly accepted icons for those addresses.

elm-html-string icon elm-html-string

Drop in elm-lang/html replacement which can serialize to a pretty `String`

elm-iso3166-data icon elm-iso3166-data

ISO 3166 data including country names, flags sprite sheet, dial codes, and more

forum icon forum

The development repository for LessWrong2, based on Vulcan JS

gcs-proxy-cloud-run icon gcs-proxy-cloud-run

A Cloud Run service to proxy a GCS bucket. Useful for conditional transcoding, certain security features, etc.

go-ethereum icon go-ethereum

Official Go implementation of the Ethereum protocol

mythril icon mythril

Security analysis tool for Ethereum smart contracts

poke icon poke

CLI tool for interacting with smart contracts

protocol icon protocol

Permissionless asset-backed, yield-bearing & overcollateralized stablecoins on Ethereum

rsd icon rsd

A stablecoin pegged to and backed by USD.

rsr icon rsr

Reserve Rights token and associated contracts

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.