Skip to content

Commit

Permalink
Merge pull request #86 from morpho-org/feat/update-read-me
Browse files Browse the repository at this point in the history
feat(readme): explaining the oracle creation from the factory
  • Loading branch information
MerlinEgalite authored Mar 7, 2024
2 parents 4697388 + dda86ee commit 1ae09fc
Showing 1 changed file with 82 additions and 16 deletions.
98 changes: 82 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Morpho Blue Oracles


Morpho Blue Oracles are contracts that can be used as oracles for markets on [Morpho Blue](https://github.com/morpho-org/morpho-blue).
The oracles implement the `IOracle` interface defined in [`IOracle.sol`](https://github.com/morpho-org/morpho-blue/blob/main/src/interfaces/IOracle.sol#L9): they return the price of 1 asset of collateral token quoted in 1 asset of loan token.

## ChainlinkOracle
## MorphoChainlinkOracleV2

The `ChainlinkOracle` is an oracle that uses Chainlink-compliant feeds to provide price data.
The `MorphoChainlinkOracleV2` is an oracle that uses Chainlink-interface-compliant feeds to provide price data.

This oracle handles the following cases among others (let's say that our pair is A/B):

- A/B is a feed (typically, stETH/ETH).
- B/A is a feed (typically, ETH/USDC).
- A/C and B/C are feeds (typically, stETH/ETH and USDC/ETH).
Expand All @@ -18,32 +18,98 @@ This oracle handles the following cases among others (let's say that our pair is
- A/C and C/B are feeds (typically, WBTC/BTC and BTC/ETH).
- A'/C and B/C are feeds, and there is an exchange rate between A and A'. (typically A=sDAI and A'=DAI).

## Getting Started
## WstETH/stETH Exchange Rate Adapter

Install dependencies: `forge install`
A specific implementation, the `WstEthStEthExchangeRateChainlinkAdapter`, provides the exchange rate between wstETH and stETH as a Chainlink-interface-compliant feed.

In a `.env` file, set `ETH_RPC_URL` to the URL of an Ethereum provider.
This adapter is deployed on Ethereum Mainnet at the address [0x905b7dAbCD3Ce6B792D874e303D336424Cdb1421](https://etherscan.io/address/0x905b7dabcd3ce6b792d874e303d336424cdb1421#code).

Run test: `forge test`
## MorphoChainlinkOracleV2Factory

## Deploy an Oracle
The `MorphoChainlinkOracleV2Factory` is a factory that deploys `MorphoChainlinkOracleV2` instances.

For example, to deploy a `ChainlinkOracle` on the Ethereum mainnet for the sDAI/USDC market, run:
The factory facilitates the creation and indexing of `MorphoChainlinkOracleV2` oracles. This factory contract streamlines the process of deploying new oracles, catering to various market pairs without the need to deploy individual contracts manually for each pair.

```bash
forge create src/ChainlinkOracle.sol:ChainlinkOracle --constructor-args "0x83F20F44975D03b1b09e64809B757c47f942BEeA" "0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9" "0x0000000000000000000000000000000000000000" "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6" "0x0000000000000000000000000000000000000000" "1000000000000000000" "18" "6" --rpc-url https://eth-mainnet.g.alchemy.com/v2/<alchemy-key> --from <deployer-address> --ledger
``````
### Usage

And for the rETH/WETH market, run:
The Ethereum Mainnet address of this factory is [0x3A7bB36Ee3f3eE32A60e9f2b33c1e5f2E83ad766](https://etherscan.io/address/0x3a7bb36ee3f3ee32a60e9f2b33c1e5f2e83ad766#code).

```bash
forge create src/ChainlinkOracle.sol:ChainlinkOracle --constructor-args "0x0000000000000000000000000000000000000000" "0x536218f9E9Eb48863970252233c8F271f554C2d0" "0x0000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000" "1" "18" "18" --rpc-url https://eth-mainnet.g.alchemy.com/v2/<alchemy-key> --from <deployer-address> --ledger
To create a new `MorphoChainlinkOracleV2` oracle using the factory, call the `createMorphoChainlinkOracleV2` function with the following parameters:

- `baseVault`: The ERC4626 token vault for the base asset.
- `baseVaultConversionSample`: A sample amount for converting base vault units.
- `baseFeed1`, `baseFeed2`: Chainlink-interface-compliant data feeds for the base asset.
- `baseTokenDecimals`: Decimal precision of the base asset.
- `quoteVault`: The ERC4626 token vault for the quote asset.
- `quoteVaultConversionSample`: A sample amount for converting quote vault units.
- `quoteFeed1`, `quoteFeed2`: Chainlink-interface-compliant data feeds for the quote asset.
- `quoteTokenDecimals`: Decimal precision of the quote asset.
- `salt`: A unique identifier to create deterministic addresses for deployed oracles.

### Deploy an Oracle

To deploy a `MorphoChainlinkOracleV2` on the Ethereum mainnet, use the `MorphoChainlinkOracleV2Factory` to create a new oracle.

Below are the arguments to fill for the creation of the WETH/USDT oracle:

```json
- `baseVault`: "0x0000000000000000000000000000000000000000",
- `baseVaultConversionSample`: 1,
- `baseFeed1`: "0x0000000000000000000000000000000000000000",
- `baseFeed2`: "0x0000000000000000000000000000000000000000",
- `baseTokenDecimals`: 18,
- `quoteVault`:"0x0000000000000000000000000000000000000000",
- `quoteVaultConversionSample`: 1,
- `quoteFeed1`: "0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46",
- `quoteFeed2`: "0x0000000000000000000000000000000000000000",
- `quoteTokenDecimals`: 6,
- `salt`: <user-defined value used to make the address unique>,
```

and for the sDAI/USDC oracle:

```json
- `baseVault`: "0x83F20F44975D03b1b09e64809B757c47f942BEeA",
- `baseVaultConversionSample`: 1000000000000000000, // 1e18
- `baseFeed1`: "0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9",
- `baseFeed2`: "0x0000000000000000000000000000000000000000",
- `baseTokenDecimals`: 18,
- `quoteVault`: "0x0000000000000000000000000000000000000000",
- `quoteVaultConversionSample`: 1,
- `quoteFeed1`: "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6",
- `quoteFeed2`: "0x0000000000000000000000000000000000000000",
- `quoteTokenDecimals`: 6,
- `salt`: <user-defined value used to make the address unique>,
```

and for the wstETH/ETH oracle:

```json
- `baseVault`: "0x0000000000000000000000000000000000000000",
- `baseVaultConversionSample`: 1,
- `baseFeed1`: "0x905b7dAbCD3Ce6B792D874e303D336424Cdb1421",
- `baseFeed2`: "0x86392dC19c0b719886221c78AB11eb8Cf5c52812",
- `baseTokenDecimals`: 18,
- `quoteVault`: "0x0000000000000000000000000000000000000000",
- `quoteVaultConversionSample`: 1,
- `quoteFeed1`: "0x0000000000000000000000000000000000000000",
- `quoteFeed2`: "0x0000000000000000000000000000000000000000",
- `quoteTokenDecimals`: 18,
- `salt`: <user-defined value used to make the address unique>,
```

## Getting Started

Install dependencies: `forge install`

In a `.env` file, set `ETH_RPC_URL` to the URL of an Ethereum provider.

Run test: `forge test`

## Audits

All audits are stored in the [audits](./audits/)' folder.

## License

Morpho Blue Oracles are licensed under `GPL-2.0-or-later`, see [`LICENSE`](./LICENSE).
Morpho Blue Oracles are licensed under `GPL-2.0-or-later`, see [`LICENSE`](./LICENSE).

0 comments on commit 1ae09fc

Please sign in to comment.