Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions contracts/lending/ITokenInfo.sol

This file was deleted.

142 changes: 85 additions & 57 deletions contracts/lending/IVaultController.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./ITokenInfo.sol";
struct TokenInfo {
bool isLP;
address tokenAddress;
address oracleAddress;
address wrappedTokenAddress;
uint256 LTV;
uint256 liquidationIncentive;
}

// @title VaultController Events
/// @notice interface which contains any events which the VaultController contract emits
Expand Down Expand Up @@ -31,24 +38,31 @@ interface VaultControllerEvents {
event Withdrawn(uint256 vaultId, address asset_address, uint256 amount);
}

struct VaultSummary {
uint96 id;
uint192 borrowingPower;
uint192 vaultLiability;
address[] tokenAddresses;
uint256[] tokenBalances;
}

/// @title VaultController Interface
/// @notice extends VaultControllerEvents
interface IVaultController is VaultControllerEvents, ITokenInfo {
interface IVaultControllerState {
// initializer
function initialize(address convex, address vaultControllerRewards, address vaultControllerCoreLogic, address vaultControllerSetter) external;

function FEE_DENOMINATOR() external view returns (uint256);
function initialize(
address convex,
address _vaultControllerRewards,
address _vaultControllerCoreLogic,
address _vaultControllerSetter
) external;

function earmarkIncentive() external view returns (uint256);

function vaultControllerRewards() external view returns (address);

function lockIncentive() external view returns (uint256);

function stakerIncentive() external view returns (uint256);

function platformFee() external view returns (uint256);

function MaxFees() external view returns (uint256);

function FEE_DENOMINATOR() external view returns (uint256);
}

interface IVaultControllerSetter is VaultControllerEvents {
function tokensRegistered() external view returns (uint256);

function vaultsMinted() external view returns (uint96);
Expand All @@ -65,29 +79,63 @@ interface IVaultController is VaultControllerEvents, ITokenInfo {

function vaultIDs(address wallet) external view returns (uint96[] memory);

function amountToSolvency(uint96 id) external view returns (uint256);
function isEnabledLPToken(address) external view returns (bool);

function vaultLiability(uint96 id) external view returns (uint192);
// vault management business
function mintVault() external returns (address);

function vaultBorrowingPower(uint96 id) external view returns (uint192);
function getOracleMaster() external view returns (address);

function tokensToLiquidate(uint96 id, address token) external view returns (uint256);
function registerOracleMaster(address master_oracle_address) external;

function checkVault(uint96 id) external view returns (bool);
function getCurveMaster() external view returns (address);

function isEnabledLPToken(address) external view returns (bool);
function registerCurveMaster(address master_curve_address) external;

function changeProtocolFee(uint192 new_protocol_fee) external;

function registerErc20(
address token_address,
uint256 LTV,
address oracle_address,
uint256 liquidationIncentive,
address gauge,
bool isLP
) external;

function registerUSDa(address usda_address) external;

function updateRegisteredErc20(
address token_address,
uint256 LTV,
address oracle_address,
uint256 liquidationIncentive
) external;

function tokenAddress_tokenId(address) external returns (uint256);

function tokenId_tokenInfo(uint256) external view returns (TokenInfo memory);
}

interface IVaultControllerCoreLogic is VaultControllerEvents {
struct VaultSummary {
uint96 id;
uint192 borrowingPower;
uint192 vaultLiability;
address[] tokenAddresses;
uint256[] tokenBalances;
}

function pay_interest() external returns (uint256);

function vaultSummaries(uint96 start, uint96 stop) external view returns (VaultSummary[] memory);

// interest calculations
function calculateInterest() external returns (uint256);
function checkVault(uint96 id) external view returns (bool);

// vault management business
function mintVault() external returns (address);
// admin
function pause() external;

function patchTBL() external;
function unpause() external;

function liquidateVault(
uint96 id,
Expand All @@ -113,42 +161,22 @@ interface IVaultController is VaultControllerEvents, ITokenInfo {

function repayAllUSDa(uint96 id) external;

// admin
function pause() external;

function unpause() external;

function getOracleMaster() external view returns (address);

function registerOracleMaster(address master_oracle_address) external;

function getCurveMaster() external view returns (address);

function registerCurveMaster(address master_curve_address) external;
function tokensToLiquidate(uint96 id, address token) external view returns (uint256);

function changeProtocolFee(uint192 new_protocol_fee) external;
function patchTBL() external;

function registerErc20(
address token_address,
uint256 LTV,
address oracle_address,
uint256 liquidationIncentive,
address gauge,
bool isLP
) external;
function amountToSolvency(uint96 id) external view returns (uint256);

function registerUSDa(address usda_address) external;
function vaultLiability(uint96 id) external view returns (uint192);

function updateRegisteredErc20(
address token_address,
uint256 LTV,
address oracle_address,
uint256 liquidationIncentive
) external;
function vaultBorrowingPower(uint96 id) external view returns (uint192);

function _tokenAddress_tokenId(address) external returns (uint256);
// interest calculations
function calculateInterest() external returns (uint256);
}

function tokenId_tokenInfo(uint256) external view returns (TokenInfo memory);
/// @title VaultController Interface
/// @notice extends VaultControllerEvents
interface IVaultController is IVaultControllerSetter, IVaultControllerCoreLogic, IVaultControllerState {

function vaultControllerRewards() external view returns (address);
}
17 changes: 4 additions & 13 deletions contracts/lending/Vault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,6 @@ struct PoolInfo {
address rewardPool;
}

struct TokenInfo {
bool isLP;
address tokenAddress;
address oracleAddress;
address wrappedTokenAddress;
uint256 LTV;
uint256 liquidationIncentive;
}

/// @title Vault
/// @notice our implentation of maker-vault like vault
/// major differences:
Expand Down Expand Up @@ -145,9 +136,9 @@ contract Vault is IVault, Context {
IVaultControllerRewards vaultControllerRewards = IVaultControllerRewards(controllerRewards);
IVaultController(_controller).pay_interest();
// get pool info and token info
uint256 _id = _controller._tokenAddress_tokenId(asset_address);
uint256 _id = _controller.tokenAddress_tokenId(asset_address);
(address depositToken, , , address rewardPool) = vaultControllerRewards.poolInfo(_id - 1);
IVaultController.TokenInfo memory token_info = _controller.tokenId_tokenInfo(_id);
TokenInfo memory token_info = _controller.tokenId_tokenInfo(_id);
// deposit token to the wrapped token
WrappedToken(token_info.wrappedTokenAddress).deposit(msg.sender, amount);
SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable(token_info.wrappedTokenAddress), address(this), amount);
Expand All @@ -165,8 +156,8 @@ contract Vault is IVault, Context {
IVaultControllerRewards vaultControllerRewards = IVaultControllerRewards(controllerRewards);
IVaultController(_controller).pay_interest();
// get pool info and token info
uint256 _id = _controller._tokenAddress_tokenId(asset_address);
IVaultController.TokenInfo memory token_info = _controller.tokenId_tokenInfo(_id);
uint256 _id = _controller.tokenAddress_tokenId(asset_address);
TokenInfo memory token_info = _controller.tokenId_tokenInfo(_id);
(address depositToken, , address stash, ) = vaultControllerRewards.poolInfo(_id - 1);
// burn depositToken from reward pool
ITokenMinter(depositToken).burn(address(this), amount);
Expand Down
9 changes: 5 additions & 4 deletions contracts/lending/VaultControllerCoreLogic.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./VaultController.sol";
import "./VaultControllerState.sol";
import "./IVaultController.sol";

contract VaultControllerCoreLogic is VaultController {
contract VaultControllerCoreLogic is VaultControllerState, IVaultControllerCoreLogic {
using SafeERC20 for IERC20;
/// @notice any function with this modifier will call the pay_interest() function before
modifier paysInterest() {
Expand Down Expand Up @@ -206,10 +207,10 @@ contract VaultControllerCoreLogic is VaultController {
//decrease liquidator's USDa balance
_usda.vaultControllerBurn(_msgSender(), usda_to_repurchase);

IVaultControllerRewards _vaultControllerRewards = IVaultControllerRewards(vaultControllerRewards);
IVaultControllerRewards vaultControllerRewards = IVaultControllerRewards(vaultControllerRewards);
// get pool info and token info
uint256 poolID = _tokenAddress_tokenId[asset_address] - 1;
(address depositToken, , address stash, ) = _vaultControllerRewards.poolInfo(poolID);
(address depositToken, , address stash, ) = vaultControllerRewards.poolInfo(poolID);

TokenInfo memory token_info = _tokenId_tokenInfo[_tokenAddress_tokenId[asset_address]];
// withdraw and burn depositToken from reward pool
Expand Down
37 changes: 21 additions & 16 deletions contracts/lending/VaultControllerRewards.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ pragma solidity 0.8.13;
import "./interfaces.sol";

contract VaultControllerRewards {

struct PoolInfo {
address depositToken;
address gauge;
Expand Down Expand Up @@ -41,7 +40,11 @@ contract VaultControllerRewards {
owner = msg.sender;
}

function setFactories(address _rfactory, address _sfactory, address _tfactory) external {
function setFactories(
address _rfactory,
address _sfactory,
address _tfactory
) external {
require(msg.sender == owner);
//Unlike Convex, we leave these open to allow future upgrades to support new protocols
_rewardFactory = _rfactory;
Expand All @@ -51,15 +54,20 @@ contract VaultControllerRewards {
_stashFactory = _sfactory;
}

function setRewardContracts(address _rewards, address _stakerRewards) external {
function setRewardContracts(address _rewards, address _stakerRewards) external {
require(msg.sender == owner);
//also add flexibility for rewards.
lockRewards = _rewards;
stakerRewards = _stakerRewards;
}

//callback from reward contract when crv is received.
function rewardClaimed(uint256 _pid, address _tokenEarned, address _address, uint256 _amount) external returns(bool){
//callback from reward contract when crv is received.
function rewardClaimed(
uint256 _pid,
address _tokenEarned,
address _address,
uint256 _amount
) external returns (bool) {
address rewardContract = poolInfo[_pid].rewardPool;
require(msg.sender == poolInfo[_pid].stash || msg.sender == lockRewards);
address _from = msg.sender;
Expand All @@ -70,16 +78,13 @@ contract VaultControllerRewards {
return true;
}

function addPool(address _depositToken, address _gauge, address _stash, address _rewardPool) public {
function addPool(
address _depositToken,
address _gauge,
address _stash,
address _rewardPool
) public {
require(msg.sender == vaultController);
poolInfo.push(
PoolInfo({
depositToken: _depositToken,
gauge: _gauge,
stash: _stash,
rewardPool: _rewardPool
})
);
poolInfo.push(PoolInfo({depositToken: _depositToken, gauge: _gauge, stash: _stash, rewardPool: _rewardPool}));
}

}
}
9 changes: 7 additions & 2 deletions contracts/lending/VaultControllerSetter.sol
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./VaultController.sol";
import "./VaultControllerState.sol";
import "./IVaultController.sol";

/// @title Controller of all vaults in the USDa borrow/lend system
/// @notice VaultController contains all business logic for borrowing and lending through the protocol.
/// It is also in charge of accruing interest.
contract VaultControllerSetter is VaultController {
contract VaultControllerSetter is VaultControllerState, IVaultControllerSetter {
function tokenId_tokenInfo(uint256 _id) external view returns (TokenInfo memory) {
return _tokenId_tokenInfo[_id];
}

function tokenAddress_tokenId(address _token) external view returns (uint256) {
return _tokenAddress_tokenId[_token];
}

/// @notice get current interest factor
/// @return interest factor
function interestFactor() external view returns (uint192) {
Expand Down
Loading