Skip to content

Commit

Permalink
Merge pull request #1554 from morpho-dao/upgrade-morpho-1
Browse files Browse the repository at this point in the history
Upgrade Morpho #1
  • Loading branch information
MerlinEgalite committed Mar 20, 2023
2 parents c66cdf3 + 4810ba9 commit b413199
Show file tree
Hide file tree
Showing 90 changed files with 2,052 additions and 2,418 deletions.
2 changes: 1 addition & 1 deletion .github/actions/ci-foundry/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ runs:

- name: Check coverage threshold
if: ${{ inputs.codecovToken != '' }}
run: npx lcov-total lcov.info --gte=90.3
run: npx lcov-total lcov.info --gte=90
shell: bash

- name: Upload coverage to Codecov
Expand Down
74 changes: 74 additions & 0 deletions .github/workflows/ci-docs-autogen.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: Autogenerated documentation

on:
push:
branches:
- main

jobs:
autogen-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- uses: actions/setup-node@v3
with:
node-version: 16
cache: yarn

- name: Install Foundry
uses: onbjerg/foundry-toolchain@v1
with:
version: nightly

- name: Node dependencies cache
uses: actions/cache@v3
with:
path: "node_modules"
key: yarn-${{ hashFiles('yarn.lock') }}

- name: Install dependencies
run: yarn install --frozen-lockfile
shell: bash

- name: Generate docs
run: forge doc --build
shell: bash

- name: Upload docs
uses: actions/upload-artifact@v2
with:
name: docs-foundry
path: docs/book

upload-to-s3:
runs-on: ubuntu-latest
needs: autogen-docs
environment:
name: docs
url: https://developers.morpho.xyz
steps:
- name: Download docs
uses: actions/download-artifact@v2
with:
name: docs-foundry
path: docs

- name: Setup AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}

- name: Upload docs to S3
run: aws s3 sync ./docs s3://$BUCKET --delete --acl public-read
env:
BUCKET: ${{ secrets.AWS_S3_BUCKET }}

- name: Invalidate CloudFront cache
run: aws cloudfront create-invalidation --distribution-id $DISTRIBUTION --paths "/*"
env:
DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION_ID }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@ yarn-error.log*
*.ansi
*.html
lcov.*

# docs
/docs
24 changes: 13 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ It also interacts with `RewardsManager`, which manages the underlying pool's rew
## Documentation

- [White Paper](https://whitepaper.morpho.xyz)
- [Yellow Paper](https://yellowpaper.morpho.xyz/)
- [Morpho Documentation](https://docs.morpho.xyz)
- Yellow Paper (coming soon)
- [Morpho Developers Documentation](https://developers.morpho.xyz)

---

Expand All @@ -64,24 +65,25 @@ You can also send an email to [security@morpho.xyz](mailto:security@morpho.xyz)
### Morpho-Compound Ethereum

- Morpho Proxy: [0x8888882f8f843896699869179fb6e4f7e3b58888](https://etherscan.io/address/0x8888882f8f843896699869179fb6e4f7e3b58888)
- Morpho Implementation: [0xbbb011b923f382543a94e67e1d0c88d9763356e5](https://etherscan.io/address/0xbbb011b923f382543a94e67e1d0c88d9763356e5)
- PositionsManager: [0x309a4505d79fcc59affaba205fdcb880d400ef39](https://etherscan.io/address/0x309a4505d79fcc59affaba205fdcb880d400ef39)
- InterestRatesManager: [0x3e483225666871d192b686c42e6834e217a9871c](https://etherscan.io/address/0x3e483225666871d192b686c42e6834e217a9871c)
- Morpho Implementation: [0xe3d7a242614174ccf9f96bd479c42795d666fc81](https://etherscan.io/address/0xe3d7a242614174ccf9f96bd479c42795d666fc81)
- PositionsManager: [0x79a1b5888009bB4887E00EA27CF52551aAf2A004](https://etherscan.io/address/0x79a1b5888009bB4887E00EA27CF52551aAf2A004)
- InterestRatesManager: [0xD9B7209eD2936b5c06990A8356D155c3665d43Ab](https://etherscan.io/address/0xD9B7209eD2936b5c06990A8356D155c3665d43Ab)
- RewardsManager Proxy: [0x78681e63b6f3ad81ecd64aecc404d765b529c80d](https://etherscan.io/address/0x78681e63b6f3ad81ecd64aecc404d765b529c80d)
- RewardsManager Implementation: [0xf47963cc317ebe4b8ebcf30f6e144b7e7e5571b7](https://etherscan.io/address/0xf47963cc317ebe4b8ebcf30f6e144b7e7e5571b7)
- RewardsManager Implementation: [0x581c3816589ad0de7f9c76bc242c97fe96c9f100](https://etherscan.io/address/0x581c3816589ad0de7f9c76bc242c97fe96c9f100)
- Lens Proxy: [0x930f1b46e1d081ec1524efd95752be3ece51ef67](https://etherscan.io/address/0x930f1b46e1d081ec1524efd95752be3ece51ef67)
- Lens Implementation: [0xe54dde06d245fadcba50dd786f717d44c341f81b](https://etherscan.io/address/0xe54dde06d245fadcba50dd786f717d44c341f81b)
- Lens Implementation: [0x834632a7c70ddd7badd3d21ba9d885a9da66b0de](https://etherscan.io/address/0x834632a7c70ddd7badd3d21ba9d885a9da66b0de)
- Lens Extension: [0xc5c3bB32c70d1d547023346BD1E32a6c5BC7FD1e](https://etherscan.io/address/0xc5c3bB32c70d1d547023346BD1E32a6c5BC7FD1e)
- CompRewardsLens: [0x9e977f745d5ae26c6d47ac5417ee112312873ba7](https://etherscan.io/address/0x9e977f745d5ae26c6d47ac5417ee112312873ba7)

### Morpho-Aave-V2 Ethereum

- Morpho Proxy: [0x777777c9898d384f785ee44acfe945efdff5f3e0](https://etherscan.io/address/0x777777c9898d384f785ee44acfe945efdff5f3e0)
- Morpho Implementation: [0x206a1609a484db5129ca118f138e5a8abb9c61e0](https://etherscan.io/address/0x206a1609a484db5129ca118f138e5a8abb9c61e0)
- EntryPositionsManager: [0x2a46cad23484c15f60663ece368395b3a249632a](https://etherscan.io/address/0x2a46cad23484c15f60663ece368395b3a249632a)
- ExitPositionsManager: [0xfa652aa169c23277a941cf2d23d2d707fda60ed9](https://etherscan.io/address/0xfa652aa169c23277a941cf2d23d2d707fda60ed9)
- InterestRatesManager: [0x4f54235e17eb8dcdfc941a77e7734a537f7bed86](https://etherscan.io/address/0x4f54235e17eb8dcdfc941a77e7734a537f7bed86)
- Morpho Implementation: [0xFBc7693f114273739C74a3FF028C13769C49F2d0](https://etherscan.io/address/0xFBc7693f114273739C74a3FF028C13769C49F2d0)
- EntryPositionsManager: [0x029Ee1AF5BafC481f9E8FBeD5164253f1266B968](https://etherscan.io/address/0x029Ee1AF5BafC481f9E8FBeD5164253f1266B968)
- ExitPositionsManager: [0xfd9b1Ad429667D27cE666EA800f828B931A974D2](https://etherscan.io/address/0xfd9b1Ad429667D27cE666EA800f828B931A974D2)
- InterestRatesManager: [0x22a4ecf5195c87605ae6bad413ae79d5c4170ff1](https://etherscan.io/address/0x22a4ecf5195c87605ae6bad413ae79d5c4170ff1)
- Lens Proxy: [0x507fa343d0a90786d86c7cd885f5c49263a91ff4](https://etherscan.io/address/0x507fa343d0a90786d86c7cd885f5c49263a91ff4)
- Lens Implementation: [0xce23e457fb01454b8c59e31f4f72e4bd3d29b5eb](https://etherscan.io/address/0xce23e457fb01454b8c59e31f4f72e4bd3d29b5eb)
- Lens Implementation: [0x4bf26012b64312b462bf70f2e42d1be8881d0f84](https://etherscan.io/address/0x4bf26012b64312b462bf70f2e42d1be8881d0f84)

### Common Ethereum

Expand Down
Binary file added audits/Spearbit_MorphoV1.pdf
Binary file not shown.
13 changes: 1 addition & 12 deletions config/aave-v2/Config.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,11 @@ pragma solidity >=0.8.0;

import {ILendingPool} from "src/aave-v2/interfaces/aave/ILendingPool.sol";
import {IPriceOracleGetter} from "src/aave-v2/interfaces/aave/IPriceOracleGetter.sol";
import {IAaveIncentivesController} from "src/aave-v2/interfaces/aave/IAaveIncentivesController.sol";
import {ILendingPoolAddressesProvider} from "src/aave-v2/interfaces/aave/ILendingPoolAddressesProvider.sol";
import {IRewardsManager} from "src/aave-v2/interfaces/IRewardsManager.sol";
import {IIncentivesVault} from "src/aave-v2/interfaces/IIncentivesVault.sol";
import {IEntryPositionsManager} from "src/aave-v2/interfaces/IEntryPositionsManager.sol";
import {IExitPositionsManager} from "src/aave-v2/interfaces/IExitPositionsManager.sol";
import {IInterestRatesManager} from "src/aave-v2/interfaces/IInterestRatesManager.sol";
import {ILendingPoolConfigurator} from "../../../test/aave-v2/helpers/ILendingPoolConfigurator.sol";
import {ILendingPoolConfigurator} from "test/aave-v2/helpers/ILendingPoolConfigurator.sol";
import {IMorpho} from "src/aave-v2/interfaces/IMorpho.sol";

import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
Expand Down Expand Up @@ -44,29 +41,21 @@ contract Config is BaseConfig {
ILendingPoolAddressesProvider(0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5);
ILendingPoolConfigurator public lendingPoolConfigurator =
ILendingPoolConfigurator(0x311Bb771e4F8952E6Da169b425E7e92d6Ac45756);
IAaveIncentivesController public aaveIncentivesController =
IAaveIncentivesController(0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5);
IPriceOracleGetter public oracle = IPriceOracleGetter(poolAddressesProvider.getPriceOracle());
ILendingPool public pool = ILendingPool(poolAddressesProvider.getLendingPool());

address public REWARD_TOKEN = aaveIncentivesController.REWARD_TOKEN();

ProxyAdmin public proxyAdmin = ProxyAdmin(0x99917ca0426fbC677e84f873Fb0b726Bb4799cD8);

TransparentUpgradeableProxy public lensProxy =
TransparentUpgradeableProxy(payable(0x507fA343d0A90786d86C7cd885f5C49263A91FF4));
TransparentUpgradeableProxy public morphoProxy =
TransparentUpgradeableProxy(payable(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0));
TransparentUpgradeableProxy public rewardsManagerProxy;

Lens public lensImplV1;
Morpho public morphoImplV1;
IRewardsManager public rewardsManagerImplV1;

Lens public lens;
Morpho public morpho;
IRewardsManager public rewardsManager;
IIncentivesVault public incentivesVault;
IEntryPositionsManager public entryPositionsManager;
IExitPositionsManager public exitPositionsManager;
IInterestRatesManager public interestRatesManager;
Expand Down
5 changes: 3 additions & 2 deletions config/compound/Config.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
pragma solidity >=0.8.0;

import "src/compound/interfaces/compound/ICompound.sol";
import {IIncentivesVault} from "src/compound/interfaces/IIncentivesVault.sol";
import {IPositionsManager} from "src/compound/interfaces/IPositionsManager.sol";
import {IInterestRatesManager} from "src/compound/interfaces/IInterestRatesManager.sol";
import {IMorpho} from "src/compound/interfaces/IMorpho.sol";
Expand All @@ -11,6 +10,7 @@ import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transpa
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";

import {RewardsManager} from "src/compound/RewardsManager.sol";
import {LensExtension} from "src/compound/lens/LensExtension.sol";
import {Lens} from "src/compound/lens/Lens.sol";
import {Morpho} from "src/compound/Morpho.sol";
import {BaseConfig} from "../BaseConfig.sol";
Expand Down Expand Up @@ -50,9 +50,10 @@ contract Config is BaseConfig {
RewardsManager public rewardsManagerImplV1;

Lens public lens;
LensExtension public lensExtension;

Morpho public morpho;
RewardsManager public rewardsManager;
IIncentivesVault public incentivesVault;
IPositionsManager public positionsManager;
IInterestRatesManager public interestRatesManager;
}
2 changes: 1 addition & 1 deletion lib/morpho-data-structures
2 changes: 0 additions & 2 deletions scripts/aave-v2/Deploy.s.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.13;

import "src/aave-v2/interfaces/IIncentivesVault.sol";
import "src/aave-v2/interfaces/IInterestRatesManager.sol";
import "src/aave-v2/interfaces/IExitPositionsManager.sol";
import "src/aave-v2/interfaces/IEntryPositionsManager.sol";
Expand All @@ -27,7 +26,6 @@ contract Deploy is Script, Config {
IEntryPositionsManager public entryPositionsManager;
IExitPositionsManager public exitPositionsManager;
IInterestRatesManager public interestRatesManager;
IIncentivesVault public incentivesVault;

function run() external {
vm.startBroadcast();
Expand Down
3 changes: 0 additions & 3 deletions scripts/compound/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@
pragma solidity 0.8.13;

import "src/compound/interfaces/IRewardsManager.sol";
import "src/compound/interfaces/IIncentivesVault.sol";
import "src/compound/interfaces/IInterestRatesManager.sol";
import "src/compound/interfaces/IPositionsManager.sol";
import "src/compound/interfaces/compound/ICompound.sol";

import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";

import {IncentivesVault} from "src/compound/IncentivesVault.sol";
import {RewardsManager} from "src/compound/RewardsManager.sol";
import {InterestRatesManager} from "src/compound/InterestRatesManager.sol";
import {PositionsManager} from "src/compound/PositionsManager.sol";
Expand All @@ -27,7 +25,6 @@ contract Deploy is Script, Config {
Morpho public morpho;
IPositionsManager public positionsManager;
IInterestRatesManager public interestRatesManager;
IIncentivesVault public incentivesVault;
RewardsManager public rewardsManager;

function run() external {
Expand Down
6 changes: 3 additions & 3 deletions snapshots/.storage-layout-aave-v2
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
| deltas | mapping(address => struct Types.Delta) | 166 | 0 | 32 | src/aave-v2/Morpho.sol:Morpho |
| borrowMask | mapping(address => bytes32) | 167 | 0 | 32 | src/aave-v2/Morpho.sol:Morpho |
| addressesProvider | contract ILendingPoolAddressesProvider | 168 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| aaveIncentivesController | contract IAaveIncentivesController | 169 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| aaveIncentivesController | address | 169 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| pool | contract ILendingPool | 170 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| entryPositionsManager | contract IEntryPositionsManager | 171 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| exitPositionsManager | contract IExitPositionsManager | 172 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| interestRatesManager | contract IInterestRatesManager | 173 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| incentivesVault | contract IIncentivesVault | 174 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| rewardsManager | contract IRewardsManager | 175 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| incentivesVault | address | 174 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| rewardsManager | address | 175 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| treasuryVault | address | 176 | 0 | 20 | src/aave-v2/Morpho.sol:Morpho |
| marketPauseStatus | mapping(address => struct Types.MarketPauseStatus) | 177 | 0 | 32 | src/aave-v2/Morpho.sol:Morpho |

Expand Down
2 changes: 1 addition & 1 deletion snapshots/.storage-layout-compound
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
| marketStatus | mapping(address => struct Types.MarketStatus) | 168 | 0 | 32 | src/compound/Morpho.sol:Morpho |
| deltas | mapping(address => struct Types.Delta) | 169 | 0 | 32 | src/compound/Morpho.sol:Morpho |
| positionsManager | contract IPositionsManager | 170 | 0 | 20 | src/compound/Morpho.sol:Morpho |
| incentivesVault | contract IIncentivesVault | 171 | 0 | 20 | src/compound/Morpho.sol:Morpho |
| incentivesVault | address | 171 | 0 | 20 | src/compound/Morpho.sol:Morpho |
| rewardsManager | contract IRewardsManager | 172 | 0 | 20 | src/compound/Morpho.sol:Morpho |
| interestRatesManager | contract IInterestRatesManager | 173 | 0 | 20 | src/compound/Morpho.sol:Morpho |
| comptroller | contract IComptroller | 174 | 0 | 20 | src/compound/Morpho.sol:Morpho |
Expand Down
12 changes: 3 additions & 9 deletions src/aave-v2/EntryPositionsManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,6 @@ contract EntryPositionsManager is IEntryPositionsManager, PositionsManagerUtils
uint256 toRepay;
}

// Struct to avoid stack too deep.
struct BorrowAllowedVars {
uint256 i;
bytes32 userMarkets;
uint256 numberOfMarketsCreated;
}

/// LOGIC ///

/// @dev Implements supply logic.
Expand All @@ -97,13 +90,14 @@ contract EntryPositionsManager is IEntryPositionsManager, PositionsManagerUtils
if (_onBehalf == address(0)) revert AddressIsZero();
if (_amount == 0) revert AmountIsZero();
Types.Market memory market = market[_poolToken];
ERC20 underlyingToken = ERC20(market.underlyingToken);

if (!market.isCreated) revert MarketNotCreated();
if (marketPauseStatus[_poolToken].isSupplyPaused) revert SupplyIsPaused();

_updateIndexes(_poolToken);
_setSupplying(_onBehalf, borrowMask[_poolToken], true);

ERC20 underlyingToken = ERC20(market.underlyingToken);
underlyingToken.safeTransferFrom(_from, address(this), _amount);

Types.Delta storage delta = deltas[_poolToken];
Expand Down Expand Up @@ -290,6 +284,6 @@ contract EntryPositionsManager is IEntryPositionsManager, PositionsManagerUtils
uint256 _borrowedAmount
) internal returns (bool) {
Types.LiquidityData memory values = _liquidityData(_user, _poolToken, 0, _borrowedAmount);
return values.debt <= values.maxDebt;
return values.debtEth <= values.borrowableEth;
}
}
16 changes: 3 additions & 13 deletions src/aave-v2/ExitPositionsManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,6 @@ contract ExitPositionsManager is IExitPositionsManager, PositionsManagerUtils {
bool liquidationAllowed; // Whether the liquidation is allowed or not.
}

// Struct to avoid stack too deep.
struct HealthFactorVars {
uint256 i;
bytes32 userMarkets;
uint256 numberOfMarketsCreated;
}

/// LOGIC ///

/// @dev Implements withdraw logic with security checks.
Expand Down Expand Up @@ -207,6 +200,7 @@ contract ExitPositionsManager is IExitPositionsManager, PositionsManagerUtils {
address _borrower,
uint256 _amount
) external {
if (_amount == 0) revert AmountIsZero();
Types.Market memory collateralMarket = market[_poolTokenCollateral];
if (!collateralMarket.isCreated) revert MarketNotCreated();
if (marketPauseStatus[_poolTokenCollateral].isLiquidateCollateralPaused)
Expand Down Expand Up @@ -666,16 +660,12 @@ contract ExitPositionsManager is IExitPositionsManager, PositionsManagerUtils {
address _poolToken,
uint256 _withdrawnAmount
) internal returns (uint256) {
HealthFactorVars memory vars;
vars.userMarkets = userMarkets[_user];

// If the user is not borrowing any asset, return an infinite health factor.
if (!_isBorrowingAny(vars.userMarkets)) return type(uint256).max;
if (!_isBorrowingAny(userMarkets[_user])) return type(uint256).max;

Types.LiquidityData memory values = _liquidityData(_user, _poolToken, _withdrawnAmount, 0);

return
values.debt > 0 ? values.liquidationThreshold.wadDiv(values.debt) : type(uint256).max;
return values.debtEth > 0 ? values.maxDebtEth.wadDiv(values.debtEth) : type(uint256).max;
}

/// @dev Checks whether the user can withdraw or not.
Expand Down
Loading

0 comments on commit b413199

Please sign in to comment.