AlkemiEarnVerified.sol

View Source: contracts/AlkemiEarnVerified.sol

↗ Extends: Exponential, SafeToken

Structs

Balance

struct Balance {
 uint256 principal,
 uint256 interestIndex
}

Market

struct Market {
 bool isSupported,
 uint256 blockNumber,
 contract InterestRateModel interestRateModel,
 uint256 totalSupply,
 uint256 supplyRateMantissa,
 uint256 supplyIndex,
 uint256 totalBorrows,
 uint256 borrowRateMantissa,
 uint256 borrowIndex
}

SupplyLocalVars

struct SupplyLocalVars {
 uint256 startingBalance,
 uint256 newSupplyIndex,
 uint256 userSupplyCurrent,
 uint256 userSupplyUpdated,
 uint256 newTotalSupply,
 uint256 currentCash,
 uint256 updatedCash,
 uint256 newSupplyRateMantissa,
 uint256 newBorrowIndex,
 uint256 newBorrowRateMantissa
}

WithdrawLocalVars

struct WithdrawLocalVars {
 uint256 withdrawAmount,
 uint256 startingBalance,
 uint256 newSupplyIndex,
 uint256 userSupplyCurrent,
 uint256 userSupplyUpdated,
 uint256 newTotalSupply,
 uint256 currentCash,
 uint256 updatedCash,
 uint256 newSupplyRateMantissa,
 uint256 newBorrowIndex,
 uint256 newBorrowRateMantissa,
 uint256 withdrawCapacity,
 struct Exponential.Exp accountLiquidity,
 struct Exponential.Exp accountShortfall,
 struct Exponential.Exp ethValueOfWithdrawal
}

AccountValueLocalVars

struct AccountValueLocalVars {
 address assetAddress,
 uint256 collateralMarketsLength,
 uint256 newSupplyIndex,
 uint256 userSupplyCurrent,
 uint256 newBorrowIndex,
 uint256 userBorrowCurrent,
 struct Exponential.Exp borrowTotalValue,
 struct Exponential.Exp sumBorrows,
 struct Exponential.Exp supplyTotalValue,
 struct Exponential.Exp sumSupplies
}

PayBorrowLocalVars

struct PayBorrowLocalVars {
 uint256 newBorrowIndex,
 uint256 userBorrowCurrent,
 uint256 repayAmount,
 uint256 userBorrowUpdated,
 uint256 newTotalBorrows,
 uint256 currentCash,
 uint256 updatedCash,
 uint256 newSupplyIndex,
 uint256 newSupplyRateMantissa,
 uint256 newBorrowRateMantissa,
 uint256 startingBalance
}

BorrowLocalVars

struct BorrowLocalVars {
 uint256 newBorrowIndex,
 uint256 userBorrowCurrent,
 uint256 borrowAmountWithFee,
 uint256 userBorrowUpdated,
 uint256 newTotalBorrows,
 uint256 currentCash,
 uint256 updatedCash,
 uint256 newSupplyIndex,
 uint256 newSupplyRateMantissa,
 uint256 newBorrowRateMantissa,
 uint256 startingBalance,
 struct Exponential.Exp accountLiquidity,
 struct Exponential.Exp accountShortfall,
 struct Exponential.Exp ethValueOfBorrowAmountWithFee
}

LiquidateLocalVars

struct LiquidateLocalVars {
 address targetAccount,
 address assetBorrow,
 address liquidator,
 address assetCollateral,
 uint256 newBorrowIndex_UnderwaterAsset,
 uint256 newSupplyIndex_UnderwaterAsset,
 uint256 newBorrowIndex_CollateralAsset,
 uint256 newSupplyIndex_CollateralAsset,
 uint256 currentBorrowBalance_TargetUnderwaterAsset,
 uint256 updatedBorrowBalance_TargetUnderwaterAsset,
 uint256 newTotalBorrows_ProtocolUnderwaterAsset,
 uint256 startingBorrowBalance_TargetUnderwaterAsset,
 uint256 startingSupplyBalance_TargetCollateralAsset,
 uint256 startingSupplyBalance_LiquidatorCollateralAsset,
 uint256 currentSupplyBalance_TargetCollateralAsset,
 uint256 updatedSupplyBalance_TargetCollateralAsset,
 uint256 currentSupplyBalance_LiquidatorCollateralAsset,
 uint256 updatedSupplyBalance_LiquidatorCollateralAsset,
 uint256 newTotalSupply_ProtocolCollateralAsset,
 uint256 currentCash_ProtocolUnderwaterAsset,
 uint256 updatedCash_ProtocolUnderwaterAsset,
 uint256 newSupplyRateMantissa_ProtocolUnderwaterAsset,
 uint256 newBorrowRateMantissa_ProtocolUnderwaterAsset,
 uint256 discountedRepayToEvenAmount,
 uint256 discountedBorrowDenominatedCollateral,
 uint256 maxCloseableBorrowAmount_TargetUnderwaterAsset,
 uint256 closeBorrowAmount_TargetUnderwaterAsset,
 uint256 seizeSupplyAmount_TargetCollateralAsset,
 uint256 reimburseAmount,
 struct Exponential.Exp collateralPrice,
 struct Exponential.Exp underwaterAssetPrice
}

Contract Members

Constants & Variables

//internal members
uint256 internal initialInterestIndex;
uint256 internal defaultOriginationFee;
uint256 internal defaultCollateralRatio;
uint256 internal defaultLiquidationDiscount;

//public members
uint256 public minimumCollateralRatioMantissa;
uint256 public maximumLiquidationDiscountMantissa;
address public pendingAdmin;
address public admin;
mapping(address => bool) public managers;
contract ChainLink public priceOracle;
mapping(address => mapping(address => struct AlkemiEarnVerified.Balance)) public supplyBalances;
mapping(address => mapping(address => struct AlkemiEarnVerified.Balance)) public borrowBalances;
contract AlkemiWETH public WETHContract;
mapping(address => struct AlkemiEarnVerified.Market) public markets;
address[] public collateralMarkets;
struct Exponential.Exp public collateralRatio;
struct Exponential.Exp public originationFee;
struct Exponential.Exp public liquidationDiscount;
bool public paused;
mapping(address => bool) public KYCAdmins;
mapping(address => bool) public customersWithKYC;
mapping(address => bool) public liquidators;
mapping(address => mapping(address => uint256)) public originationFeeBalance;
contract RewardControlInterface public rewardControl;
uint256 public closeFactorMantissa;
uint256 public _guardCounter;

//private members
bool private initializationDone;
address private oracle;
address private wethAddress;

Events

event LiquidatorChanged(address indexed Liquidator, bool  newStatus);
event SupplyReceived(address  account, address  asset, uint256  amount, uint256  startingBalance, uint256  newBalance);
event SupplyWithdrawn(address  account, address  asset, uint256  amount, uint256  startingBalance, uint256  newBalance);
event BorrowTaken(address  account, address  asset, uint256  amount, uint256  startingBalance, uint256  borrowAmountWithFee, uint256  newBalance);
event BorrowRepaid(address  account, address  asset, uint256  amount, uint256  startingBalance, uint256  newBalance);
event BorrowLiquidated(address indexed targetAccount, address  assetBorrow, uint256  borrowBalanceAccumulated, uint256  amountRepaid, address indexed liquidator, address  assetCollateral, uint256  amountSeized);
event EquityWithdrawn(address indexed asset, uint256  equityAvailableBefore, uint256  amount, address indexed owner);
event KYCAdminChanged(address indexed KYCAdmin, bool  newStatus);
event KYCCustomerChanged(address indexed KYCCustomer, bool  newStatus);

Modifiers

  • onlyOwner

  • onlyCustomerWithKYC

  • nonReentrant

onlyOwner

Modifier to check if the caller is the admin of the contract

modifier onlyOwner() internal

Arguments

onlyCustomerWithKYC

Modifier to check if the caller is KYC verified

modifier onlyCustomerWithKYC() internal

Arguments

nonReentrant

Prevents a contract from calling itself, directly or indirectly. If you mark a function nonReentrant, you should also mark it external. Calling one nonReentrant function from another is not supported. Instead, you can implement a private function doing the actual work, and an external wrapper marked as nonReentrant.

modifier nonReentrant() internal

Arguments

Functions

  • initializer()

  • ()

  • _changeKYCAdmin(address KYCAdmin, bool newStatus)

  • _changeCustomerKYC(address customer, bool newStatus)

  • _changeLiquidator(address liquidator, bool newStatus)

  • min(uint256 a, uint256 b)

  • addCollateralMarket(address asset)

  • calculateInterestIndex(uint256 startingInterestIndex, uint256 interestRateMantissa, uint256 blockStart, uint256 blockEnd)

  • calculateBalance(uint256 startingBalance, uint256 interestIndexStart, uint256 interestIndexEnd)

  • getPriceForAssetAmount(address asset, uint256 assetAmount, bool mulCollatRatio)

  • calculateBorrowAmountWithFee(uint256 borrowAmount)

  • fetchAssetPrice(address asset)

  • assetPrices(address asset)

  • getAssetAmountForValue(address asset, struct Exponential.Exp ethValue)

  • _adminFunctions(address newPendingAdmin, address newOracle, bool requestedState, uint256 originationFeeMantissa, uint256 newCloseFactorMantissa, address wethContractAddress, address _rewardControl)

  • _acceptAdmin()

  • getAccountLiquidity(address account)

  • getSupplyBalance(address account, address asset)

  • getBorrowBalance(address account, address asset)

  • _supportMarket(address asset, InterestRateModel interestRateModel)

  • _suspendMarket(address asset)

  • _setRiskParameters(uint256 collateralRatioMantissa, uint256 liquidationDiscountMantissa)

  • _setMarketInterestRateModel(address asset, InterestRateModel interestRateModel)

  • _withdrawEquity(address asset, uint256 amount)

  • supplyEther(uint256 etherAmount)

  • revertEtherToUser(address user, uint256 etherAmount)

  • supply(address asset, uint256 amount)

  • withdrawEther(address user, uint256 etherAmount)

  • withdraw(address asset, uint256 requestedAmount)

  • calculateAccountLiquidity(address userAddress)

  • calculateAccountValuesInternal(address userAddress)

  • calculateAccountValues(address userAddress)

  • repayBorrow(address asset, uint256 amount)

  • liquidateBorrow(address targetAccount, address assetBorrow, address assetCollateral, uint256 requestedAmountClose)

  • calculateDiscountedRepayToEvenAmount(address targetAccount, struct Exponential.Exp underwaterAssetPrice, address assetBorrow)

  • calculateDiscountedBorrowDenominatedCollateral(struct Exponential.Exp underwaterAssetPrice, struct Exponential.Exp collateralPrice, uint256 supplyCurrent_TargetCollateralAsset)

  • calculateAmountSeize(struct Exponential.Exp underwaterAssetPrice, struct Exponential.Exp collateralPrice, uint256 closeBorrowAmount_TargetUnderwaterAsset)

  • borrow(address asset, uint256 amount)

  • supplyOriginationFeeAsAdmin(address asset, address user, uint256 amount, uint256 newSupplyIndex)

  • refreshAlkIndex(address market, address user, bool isSupply, bool isVerified)

  • getMarketBalances(address asset)

  • revertIfError(enum ErrorReporter.Error err)

initializer

AlkemiEarnVerified is the core contract

function initializer() public nonpayable

Arguments

Do not pay directly into AlkemiEarnVerified, please use supply.

function () public payable

Arguments

_changeKYCAdmin

Function for use by the admin of the contract to add or remove KYC Admins

function _changeKYCAdmin(address KYCAdmin, bool newStatus) public nonpayable onlyOwner

Arguments

_changeCustomerKYC

Function for use by the KYC admins to add or remove KYC Customers

function _changeCustomerKYC(address customer, bool newStatus) public nonpayable

Arguments

_changeLiquidator

Function for use by the admin of the contract to add or remove Liquidators

function _changeLiquidator(address liquidator, bool newStatus) public nonpayable onlyOwner

Arguments

min

Simple function to calculate min between two numbers.

function min(uint256 a, uint256 b) internal pure
returns(uint256)

Arguments

addCollateralMarket

Adds a given asset to the list of collateral markets. This operation is impossible to reverse. Note: this will not add the asset if it already exists.

function addCollateralMarket(address asset) internal nonpayable

Arguments

calculateInterestIndex

Calculates a new supply index based on the prevailing interest rates applied over time This is defined as we multiply the most recent supply index by (1 + blocks times rate)

function calculateInterestIndex(uint256 startingInterestIndex, uint256 interestRateMantissa, uint256 blockStart, uint256 blockEnd) internal pure
returns(enum ErrorReporter.Error, uint256)

Returns

Return value is expressed in 1e18 scale

Arguments

calculateBalance

Calculates a new balance based on a previous balance and a pair of interest indices This is defined as: The user's last balance checkpoint is multiplied by the currentSupplyIndex value and divided by the user's checkpoint index value

function calculateBalance(uint256 startingBalance, uint256 interestIndexStart, uint256 interestIndexEnd) internal pure
returns(enum ErrorReporter.Error, uint256)

Returns

Return value is expressed in 1e18 scale

Arguments

getPriceForAssetAmount

Gets the price for the amount specified of the given asset.

function getPriceForAssetAmount(address asset, uint256 assetAmount, bool mulCollatRatio) internal view
returns(enum ErrorReporter.Error, struct Exponential.Exp)

Returns

Return value is expressed in a magnified scale per token decimals

Arguments

calculateBorrowAmountWithFee

Calculates the origination fee added to a given borrowAmount This is simply (1 + originationFee) * borrowAmount

function calculateBorrowAmountWithFee(uint256 borrowAmount) internal view
returns(enum ErrorReporter.Error, uint256)

Returns

Return value is expressed in 1e18 scale

Arguments

fetchAssetPrice

fetches the price of asset from the PriceOracle and converts it to Exp

function fetchAssetPrice(address asset) internal view
returns(enum ErrorReporter.Error, struct Exponential.Exp)

Returns

Return value is expressed in a magnified scale per token decimals

Arguments

assetPrices

Reads scaled price of specified asset from the price oracle

function assetPrices(address asset) public view
returns(uint256)

Returns

0 on an error or missing price, the price scaled by 1e18 otherwise

Arguments

getAssetAmountForValue

Gets the amount of the specified asset given the specified Eth value ethValue / oraclePrice = assetAmountWei If there's no oraclePrice, this returns (Error.DIVISION_BY_ZERO, 0)

function getAssetAmountForValue(address asset, struct Exponential.Exp ethValue) internal view
returns(enum ErrorReporter.Error, uint256)

Returns

Return value is expressed in a magnified scale per token decimals

Arguments

_adminFunctions

Admin Functions. The newPendingAdmin must call _acceptAdmin to finalize the transfer.

function _adminFunctions(address newPendingAdmin, address newOracle, bool requestedState, uint256 originationFeeMantissa, uint256 newCloseFactorMantissa, address wethContractAddress, address _rewardControl) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

_acceptAdmin

Accepts transfer of admin rights. msg.sender must be pendingAdmin

function _acceptAdmin() public nonpayable

Arguments

getAccountLiquidity

returns the liquidity for given account. a positive result indicates ability to borrow, whereas a negative result indicates a shortfall which may be liquidated

function getAccountLiquidity(address account) public view
returns(int256)

Returns

signed integer in terms of eth-wei (negative indicates a shortfall)

Arguments

getSupplyBalance

return supply balance with any accumulated interest for asset belonging to account

function getSupplyBalance(address account, address asset) public view
returns(uint256)

Returns

uint supply balance on success, throws on failed assertion otherwise

Arguments

getBorrowBalance

return borrow balance with any accumulated interest for asset belonging to account

function getBorrowBalance(address account, address asset) public view
returns(uint256)

Returns

uint borrow balance on success, throws on failed assertion otherwise

Arguments

_supportMarket

Supports a given market (asset) for use

function _supportMarket(address asset, InterestRateModel interestRateModel) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

_suspendMarket

Suspends a given supported market (asset) from use. Assets in this state do count for collateral, but users may only withdraw, payBorrow, and liquidate the asset. The liquidate function no longer checks collateralization.

function _suspendMarket(address asset) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

_setRiskParameters

Sets the risk parameters: collateral ratio and liquidation discount

function _setRiskParameters(uint256 collateralRatioMantissa, uint256 liquidationDiscountMantissa) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

_setMarketInterestRateModel

Sets the interest rate model for a given market

function _setMarketInterestRateModel(address asset, InterestRateModel interestRateModel) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

_withdrawEquity

withdraws amount of asset from equity for asset, as long as amount <= equity. Equity = cash + borrows - supply

function _withdrawEquity(address asset, uint256 amount) public nonpayable onlyOwner 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

supplyEther

Convert Ether supplied by user into WETH tokens and then supply corresponding WETH to user

function supplyEther(uint256 etherAmount) internal nonpayable
returns(uint256)

Returns

errors if any

Arguments

revertEtherToUser

Revert Ether paid by user back to user's account in case transaction fails due to some other reason

function revertEtherToUser(address user, uint256 etherAmount) internal nonpayable

Arguments

supply

supply amount of asset (which must be supported) to msg.sender in the protocol

function supply(address asset, uint256 amount) public payable nonReentrant onlyCustomerWithKYC 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

withdrawEther

withdraw amount of ether from sender's account to sender's address

function withdrawEther(address user, uint256 etherAmount) internal nonpayable
returns(uint256)

Arguments

withdraw

withdraw amount of asset from sender's account to sender's address

function withdraw(address asset, uint256 requestedAmount) public nonpayable nonReentrant 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

calculateAccountLiquidity

Gets the user's account liquidity and account shortfall balances. This includes any accumulated interest thus far but does NOT actually update anything in storage, it simply calculates the account liquidity and shortfall with liquidity being returned as the first Exp, ie (Error, accountLiquidity, accountShortfall).

function calculateAccountLiquidity(address userAddress) internal view
returns(enum ErrorReporter.Error, struct Exponential.Exp, struct Exponential.Exp)

Returns

Return values are expressed in 1e18 scale

Arguments

calculateAccountValuesInternal

Gets the ETH values of the user's accumulated supply and borrow balances, scaled by 10e18. This includes any accumulated interest thus far but does NOT actually update anything in storage

function calculateAccountValuesInternal(address userAddress) internal view
returns(enum ErrorReporter.Error, struct Exponential.Exp, struct Exponential.Exp)

Returns

(error code, sum ETH value of supplies scaled by 10e18, sum ETH value of borrows scaled by 10e18)

Arguments

calculateAccountValues

Gets the ETH values of the user's accumulated supply and borrow balances, scaled by 10e18. This includes any accumulated interest thus far but does NOT actually update anything in storage

function calculateAccountValues(address userAddress) public view
returns(uint256, uint256, uint256)

Returns

(uint 0=success; otherwise a failure (see ErrorReporter.sol for details), sum ETH value of supplies scaled by 10e18, sum ETH value of borrows scaled by 10e18)

Arguments

repayBorrow

Users repay borrowed assets from their own address to the protocol.

function repayBorrow(address asset, uint256 amount) public payable nonReentrant 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

liquidateBorrow

users repay all or some of an underwater borrow and receive collateral

function liquidateBorrow(address targetAccount, address assetBorrow, address assetCollateral, uint256 requestedAmountClose) public payable
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

calculateDiscountedRepayToEvenAmount

This should ONLY be called if market is supported. It returns shortfall / [Oracle price for the borrow * (collateralRatio - liquidationDiscount - 1)] If the market isn't supported, we support liquidation of asset regardless of shortfall because we want borrows of the unsupported asset to be closed. Note that if collateralRatio = liquidationDiscount + 1, then the denominator will be zero and the function will fail with DIVISION_BY_ZERO.

function calculateDiscountedRepayToEvenAmount(address targetAccount, struct Exponential.Exp underwaterAssetPrice, address assetBorrow) internal view
returns(enum ErrorReporter.Error, uint256)

Returns

Return values are expressed in 1e18 scale

Arguments

calculateDiscountedBorrowDenominatedCollateral

discountedBorrowDenominatedCollateral = [supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow)

function calculateDiscountedBorrowDenominatedCollateral(struct Exponential.Exp underwaterAssetPrice, struct Exponential.Exp collateralPrice, uint256 supplyCurrent_TargetCollateralAsset) internal view
returns(enum ErrorReporter.Error, uint256)

Returns

Return values are expressed in 1e18 scale

Arguments

calculateAmountSeize

returns closeBorrowAmount_TargetUnderwaterAsset (1+liquidationDiscount) priceBorrow/priceCollateral

function calculateAmountSeize(struct Exponential.Exp underwaterAssetPrice, struct Exponential.Exp collateralPrice, uint256 closeBorrowAmount_TargetUnderwaterAsset) internal view
returns(enum ErrorReporter.Error, uint256)

Returns

Return values are expressed in 1e18 scale

Arguments

borrow

Users borrow assets from the protocol to their own address

function borrow(address asset, uint256 amount) public nonpayable nonReentrant onlyCustomerWithKYC 
returns(uint256)

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

supplyOriginationFeeAsAdmin

supply amount of asset (which must be supported) to admin in the protocol

function supplyOriginationFeeAsAdmin(address asset, address user, uint256 amount, uint256 newSupplyIndex) private nonpayable

Returns

uint 0=success, otherwise a failure (see ErrorReporter.sol for details)

Arguments

refreshAlkIndex

Trigger the underlying Reward Control contract to accrue ALK supply rewards for the supplier on the specified market

function refreshAlkIndex(address market, address user, bool isSupply, bool isVerified) internal nonpayable

Arguments

getMarketBalances

Get supply and borrows for a market

function getMarketBalances(address asset) public view
returns(uint256, uint256)

Returns

updated supply and borrows

Arguments

revertIfError

Function to revert in case of an internal exception

function revertIfError(enum ErrorReporter.Error err) internal pure

Arguments

Last updated