Skip to content

Latest commit

 

History

History
119 lines (85 loc) · 3.31 KB

README.md

File metadata and controls

119 lines (85 loc) · 3.31 KB

wrapped-tokens

Wrapped tokens representing staked and generic assets.

Setup

Requirements:

  • Node >= v12
  • Yarn
$ cd wrapped-tokens
$ npm i -g yarn       # Install yarn if you don't already have it
$ yarn install        # Install dependencies
$ yarn setup          # Setup Git hooks

TypeScript type definition files for the contracts

To generate type definitions:

$ yarn compile && yarn typechain

Linting and Formatting

To check code for problems:

$ yarn typecheck      # Type-check TypeScript code
$ yarn lint           # Check JavaScript and TypeScript code
$ yarn lint --fix     # Fix problems where possible
$ yarn solhint        # Check Solidity code
$ yarn slither        # Run Slither

To auto-format code:

$ yarn fmt

Testing

Run all tests:

$ yarn test

To run tests in a specific file, run:

$ yarn test [path/to/file]

To run tests and generate test coverage, run:

$ yarn coverage

Contracts

High Level Flow

The implementation consists of 4 separate contracts, reusing centre-tokens audited and battle tested code whenever possible.

  • A proxy contract which is an exact duplicate of the proxy contract used be centre-tokens.
  • A token contract which for generic wrapped assets will be an exact duplicate of centre-tokens fiat token or for wrapped staked assets will be a staked token (StakedTokenV1.sol) which inherits directly from centre-token's fiat tokens and adds exchange rate functionality.
  • A mint forwarder contract (MinterForwarder.sol) which contains rate limited minting functionality for our wrapped tokens.
  • An exchange rate updater contract (ExchangeRateUpdater.sol) which will only be used for wrapped staked assets and contains rate limited exchange rate updating functionality.

ERC20 compatible

All wrapped tokens implement the ERC20 interface.

Staked Token Differences from FiatToken

Wrapped staked tokens will be used to wrap staked assets. The wrapped staked tokens inherit from Centre's fiat token contract and add an oracle role that can set an exchangeRate. Both the oracle and the exchangeRate are stored in unstructured storage to maximize forward compatibility with future centre fiat token upgrades.

Rate Limited Minting

The fiat token contract's built in minting has fixed minting allowances that when depleted require the masterMinter cold key to restore the mint allowance. We've introduced a minting forwarder contract that'll allow us to continously mint up to N tokens over M time, with the mint allowance replenishing programmatically.

Rate Limited Exchange Rate Updates

Wrapped staked tokens will have a floating exchange rate that is set off-chain. Given the high frequency with which we'll have to update wrapped staked tokens exchange rates we'll utilize a seperate rate limited exchange rate updater contract to minimize operational load.

Ownable

The contract has an Owner, who can change the owner, pauser, blacklister, masterMinter, or oracle addresses. The owner can not change the proxyOwner address.