CMPVault
Initialization
constructor
constructor(IERC20 asset_, bytes memory data)
Description
The constructor initializes the CMPVault contract, setting up the initial parameters required.
Parameters
asset_
: Instance of the ERC20 token (Tether Gold - XAUT) used as collateral to mint aUSDT.data
: Encoded data containing essential parameters required for the contract initialization.
Functionality
Asset Initialization: Sets the
asset
variable to the specified ERC20 token instance.Decoding Parameters: Decodes the input
data
to extract the following parameters:collateral
: Instance of the collateral token (Tether Gold - XAUT) used.oracle
: Oracle contract address.LIQUIDATION_MULTIPLIER
: Multiplier used in determining the liquidation threshold.COLLATERALIZATION_RATE
: Rate at which collateralization must be maintained.MINT_OPENING_RETURN_FEE
: Fee charged for mint and return.
Usage
The constructor is called during the deployment of the CMPVault contract. It initializes the necessary parameters for the functioning of the contract and disables further initializers by calling _disableInitializers()
.
initialize
function initialize(bytes memory oracleData_, uint64 interest) public initializer
Description
The initialize
function further initializes the contract after deployment, setting additional parameters and executing specific actions required for functionality.
Parameters
oracleData_
: Empty memory bytes.interest
: The chosen interest rate.
Functionality
Ownership Initialization: Initializes ownership through the
__Ownable_init()
function.Interest: Updates the
accrueInfo.interest
variable.Mint Limit Setup: Sets the
mintLimit
to the maximum allowed value.Blacklist Callees: Adds the contract's own address, collateral token address, and asset token address to the
blacklistedCallees
to prevent recursive calls.Fetching Exchange Rate: Retrieves the current exchange rate from the Oracle contract.
Accrue Function Call: Executes the
accrue()
function to initialize certain internal values.
Usage
This function is called after the contract deployment to set up additional parameters and perform initial actions required for the contract's functionality.
Write Methods
accrue
function accrue() public
Description
This function is responsible for calculating and accruing interest on outstanding mintings.
Emits
updateExchangeRate
function updateExchangeRate() public
returns (bool updated, uint256 rate)
Description
Updates the exchange rate (see oracle).
Returns
updated
bool
A boolean indicating whether the exchange rate update was successful.
Emits
addCollateral
function addCollateral(address to, uint256 share)
public virtual onlyWhitelisted(to)
Description
Adds a share
amount of collateral token to to
.
Your smart contract must approveaddress(this)
to transfer the shares:
collateral.approve(address(CMPVault), share);
Parameters
share
uint256
The amount of tokens to add.
Emits
removeCollateral
function removeCollateral(address to, uint256 share)
public onlyWhitelisted(msg.sender) solvent
Description
Removes a share
amount of collateral token from msg.sender
.
Parameters
share
uint256
The amount of tokens to remove.
Emits
mint
function mint(address to, uint256 amount)
public solvent onlyWhitelisted(msg.sender)
returns (uint256 part, uint256 share)
Description
Mints an amount
of asset tokens.
Parameters
Returns
part
uint256
The mint part held by the user.
share
uint256
Warning: this value is always set to 0.
Emits
returning
function returning(address to, uint256 part)
public returns (uint256 amount)
Description
Returns a loan.
Parameters
to
address
The address for which to return the loan.
Returns
Emits
manage
function manage(
uint8[] calldata actions,
uint256[] calldata values,
bytes[] calldata datas
) external payable virtual onlyWhitelisted(msg.sender)
returns (uint256 value1, uint256 value2)
Description
Executes a set of actions and allows composability (contract calls) to other contracts.
The manage function allows to bundle functionality within one contract call while passing return values from one call to the next one.
Actions are defined by a numeric identifier and can return two values, value1
and value2
to the next function. The input arrays actions
, values
and datas
define the sequential actions. In the values
array the ether value of a call may be defined.
Whereas calling functions like mint that have the solvent modifier requires solvency at the end of the function, solvency only needs to be guaranteed at the end of the manage function, thereby allowing more complicated operations such as leveraging within one call.
For certain parameters either an external value can be passed in or the identifier USEVALUE1 (-1) or USE_VALUE2 (-2) to access either of the local variables. The following variables are marked in bold italic in the table below. If an action returns one value it is saved as value1, if two are returned they are saved as value1 and value2 respectively. Any action can access these values during the whole duration of the manage call.
The call data for the actions is ABI encoded as listed below.
Update exchange rate
11
must_update, minRate, maxRate
bool, uint256, uint256
-
-
Add collateral
10
share, to
int256, address
-
-
Remove collateral
4
share, to
int256, address
-
-
Mint
5
amount, to
int256, address
part
share
Return
2
part, to
int256, address
-
-
Get return amount
6
part
int256
amount
-
Get return part
7
amount
int256
part
-
Liquidate
31
users, maxMintParts, to, swapper, swapperData
address[], uint256[], address, ISwapperV2, bytes
-
-
Call
30
callee, callData, useValue1, useValue2, returnValues
address, bytes, bool, bool, uint8
Depends on the contract call.
Depends on the contract call.
Parameters
actions
uint8[]
An array containing the sequence of actions to execute (IDs)
values
uint256[]
The ETH amount to send along with each action (one-to-one mapping).
data
bytes[]
The ABI encoding containing the function arguments for each action (one-to-one mapping).
Returns
value1
uint256
The first return value (may be unset depending on the last action).
value2
uint256
The second return value (may be unset depending on the last action).
liquidate
function liquidate(
address[] memory users,
uint256[] memory maxMintParts,
address to,
ISwapperV2 swapper,
bytes memory swapperData
) public virtual onlyLiquidators(msg.sender)
Description
Handles the liquidation of users' balances, once the users' amount of collateral is too low.
Parameters
users
address[]
An array of user addresses.
maxMintParts
uint256[]
A one-to-one mapping to users
, contains maximum (partial) mint amounts (to liquidate) of the respective user.
to
address
Address of the receiver in open liquidations if swapper
is zero.
swapper
ISwapperV2
Contract address of the ISwapper
implementation, swappers are restricted for closed liquidations
swapperData
bytes
The ABI encoding to pass to the swap function data
argument.
Emits
withdrawFees
function withdrawFees() public
Description
Transfers all available fees to feeTo.
Emits
setFeeTo
function setFeeTo(address newFeeTo) public onlyOwner
Description
Allows owner to change the recipient of the fees.
Parameters
Emits
reduceSupply
function reduceSupply(uint256 amount) public onlyOwner
Description
Reduce the available supply of asset tokens.
Parameters
changeInterestRate
function changeInterestRate(uint64 newInterestRate) public onlyOwner
Description
Allows owner to change the interest rate.
Parameters
newInterestRate
uint64
The new interest rate.
Emits
changeMintLimit
function changeMintLimit(uint128 newMintLimit, uint128 perAddressPart) public onlyOwner
Description
Allows owner to change the mint limit.
Parameters
newMintLimit
uint128
The mint limit.
perAddressPart
uint128
The mint limit per user address.
Emits
changePermissionControl
function changePermissionControl(PermissionControl newPermissionControl) public onlyOwner
Description
Allows owner to change the permission control contract.
Parameters
Emits
setBlacklistedCallee
function setBlacklistedCallee(address callee, bool blacklisted) public onlyOwner
Description
Allows owner to:
add a callee to the blacklist.
remove a callee from the blacklist.
Parameters
callee
address
The callee's address.
blacklisted
bool
The status to set to callee
.
Emits
View Methods
asset
IERC20 public immutable asset;
Description
The ERC20 token the users can mint.
collateral
IERC20 public immutable collateral;
Description
The ERC20 token that acts as collateral to mint asset tokens.
userMintPart
mapping(address => uint256) public userMintPart;
Description
Maps each user to its total debt (i.e. its mint part).
You can convert this number into a numerical amount of asset tokens with:
totalMint.elastic / totalMint.base * userMintPart[user]
userCollateralAmount
mapping(address => uint256) public userCollateralAmount;
Description
Maps each user to its amount of collateral tokens.
totalMint
Rebase public totalMint;
Description
Represents the total loan held by minters.
Properties
base
uint128
The total amount of mint parts held by minters.
totalCollateralAmount
uint256 public totalCollateralAmount;
Description
The total amount of collateral tokens.
feeTo
address public feeTo;
Description
The recipient that will receive the fees.
oracle
IOracle public immutable oracle;
Description
The oracle from which to fetch the exchange rate.
oracleData
bytes public oracleData;
Description
The ABI encoding to pass to the oracle get function.
blacklistedCallees
mapping(address => bool) public blacklistedCallees;
Description
If an address maps to true all manageCall
actions to its functions are forbidden.
accrueInfo
AccrueInfo public accrueInfo;
Description
Some data about the accrue function.
Properties
permissionControl
PermissionControl public permissionControl;
Description
See PermissionControl.
mintLimit
MintCap public mintLimit;
Description
The current mint limit (in mint parts).
Properties
mintPartPerAddress
uint128
The mint limit per user address.
COLLATERALIZATION_RATE
uint256 public immutable COLLATERALIZATION_RATE;
Description
The collateralization rate (i.e. maximum % mintable with current collateral).
LIQUIDATION_MULTIPLIER
uint256 public immutable LIQUIDATION_MULTIPLIER;
Description
The liquidation multiplier.
MINT_OPENING_RETURN_FEE
uint256 public immutable MINT_OPENING_RETURN_FEE;
Description
The mint/return fee.
Modifiers
onlyWhitelisted
modifier onlyWhitelisted(address user)
Description
Checks if user
is present in the whitelist.
Parameters
user
address
The address to check.
onlyLiquidators
modifier onlyLiquidators(address liquidator)
Description
Checks if liquidator
is a liquidator.
Parameters
liquidator
address
The address to check.
solvent
modifier solvent()
Description
Checks if msg.sender
is solvent after executing the function body.
Events
LogAccrue
event LogAccrue(uint128 accruedAmount)
Parameters
accruedAmount
uint256
No
LogExchangeRate
event LogExchangeRate(uint256 rate);
Parameters
rate
uint256
No
LogAddCollateral
event LogAddCollateral(
address indexed from,
address indexed to,
uint256 share
)
Parameters
from
address
Yes
to
address
Yes
share
uint256
No
LogRemoveCollateral
event LogRemoveCollateral(
address indexed from,
address indexed to,
uint256 share
)
Parameters
from
address
Yes
to
address
Yes
share
uint256
No
LogMint
event LogMint(
address indexed from,
address indexed to,
uint256 amount,
uint256 part
)
Parameters
from
address
Yes
to
address
Yes
amount
uint256
No
part
uint256
No
LogReturn
event LogReturn(
address indexed from,
address indexed to,
uint256 amount,
uint256 part
);
Parameters
from
address
Yes
to
address
Yes
amount
uint256
No
part
uint256
No
LogLiquidation
event LogLiquidation(
address indexed from,
address indexed user,
address indexed to,
uint256 collateralAmount,
uint256 mintAmount,
uint256 mintPart
);
Parameters
from
address
Yes
user
address
Yes
to
address
Yes
collateralAmount
uint256
No
mintAmount
uint256
No
mintPart
uint256
No
LogWithdrawFees
event LogWithdrawFees(
address indexed feeTo,
uint256 feesEarnedFraction
);
Parameters
feeTo
address
Yes
feesEarnedFraction
uint256
No
LogFeeTo
event LogFeeTo(address indexed newFeeTo);
Parameters
newFeeTo
address
Yes
LogInterestChange
event LogInterestChange(
uint64 oldInterestRate,
uint64 newInterestRate
);
Parameters
oldInterestRate
uint64
No
newInterestRate
uint64
No
LogChangeMintLimit
event LogChangeMintLimit(
uint128 newLimit,
uint128 perAddressPart
);
Parameters
newLimit
uint128
No
perAddressPart
uint128
No
LogChangeBlacklistedCallee
event LogChangeBlacklistedCallee(
address indexed account,
bool blacklisted
);
Parameters
account
address
Yes
blacklisted
bool
No
LogChangePermissionControl
event LogChangePermissionControl(PermissionControl indexed newPermissionControl);
Parameters
newPermissionControl
PermissionControl
Yes
Last updated