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

  1. Asset Initialization: Sets the asset variable to the specified ERC20 token instance.

  2. 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

  1. Ownership Initialization: Initializes ownership through the __Ownable_init() function.

  2. Interest: Updates the accrueInfo.interest variable.

  3. Mint Limit Setup: Sets the mintLimit to the maximum allowed value.

  4. Blacklist Callees: Adds the contract's own address, collateral token address, and asset token address to the blacklistedCallees to prevent recursive calls.

  5. Fetching Exchange Rate: Retrieves the current exchange rate from the Oracle contract.

  6. 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

LogAccrue

updateExchangeRate

function updateExchangeRate() public 
    returns (bool updated, uint256 rate)

Description

Updates the exchange rate (see oracle).

Returns

NameTypeDescription

updated

bool

A boolean indicating whether the exchange rate update was successful.

rate

uint256

The latest exchange rate fetched from the oracle smart contract.

Emits

LogExchangeRate

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

NameTypeDescription

to

address

The receiver of the collateral tokens.

share

uint256

The amount of tokens to add.

Emits

LogAddCollateral

removeCollateral

function removeCollateral(address to, uint256 share)
    public onlyWhitelisted(msg.sender) solvent

Description

Removes a share amount of collateral token from msg.sender.

Parameters

NameTypeDescription

to

address

The receiver of the collateral tokens.

share

uint256

The amount of tokens to remove.

Emits

LogRemoveCollateral

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

NameTypeDescription

to

address

The receiver of the asset tokens.

amount

uint256

The amount of asset tokens to mint.

Returns

NameTypeDescription

part

uint256

The mint part held by the user.

share

uint256

Warning: this value is always set to 0.

Emits

LogAccrue

LogMint

returning

function returning(address to, uint256 part)
    public returns (uint256 amount)

Description

Returns a loan.

Parameters

NameTypeDescription

to

address

The address for which to return the loan.

part

uint256

The amount to return (see userMintPart).

Returns

NameTypeDescription

amount

uint256

The amount of asset tokens that has been returned.

Emits

LogAccrue

LogReturn

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.

ActionIDParametersABI encodingvalue1value2

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

NameTypeDescription

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

NameTypeDescription

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

NameTypeDescription

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

LogRemoveCollateral

LogReturn

LogLiquidation

withdrawFees

function withdrawFees() public

Description

Transfers all available fees to feeTo.

Emits

LogAccrue

LogWithdrawFees

setFeeTo

function setFeeTo(address newFeeTo) public onlyOwner

Description

Allows owner to change the recipient of the fees.

Parameters

NameTypeDescription

newFeeTo

address

The new recipient (see feeTo).

Emits

LogFeeTo

reduceSupply

function reduceSupply(uint256 amount) public onlyOwner

Description

Reduce the available supply of asset tokens.

Parameters

NameTypeDescription

amount

uint256

The amount of asset tokens to remove from the contract's supply.

changeInterestRate

function changeInterestRate(uint64 newInterestRate) public onlyOwner

Description

Allows owner to change the interest rate.

Parameters

NameTypeDescription

newInterestRate

uint64

The new interest rate.

Emits

LogInterestChange

changeMintLimit

function changeMintLimit(uint128 newMintLimit, uint128 perAddressPart) public onlyOwner

Description

Allows owner to change the mint limit.

Parameters

NameTypeDescription

newMintLimit

uint128

The mint limit.

perAddressPart

uint128

The mint limit per user address.

Emits

LogChangeMintLimit

changePermissionControl

function changePermissionControl(PermissionControl newPermissionControl) public onlyOwner

Description

Allows owner to change the permission control contract.

Parameters

NameTypeDescription

newPermissionControl

PermissionControl

The new permission control contract (see permissionControl).

Emits

LogChangePermissionControl

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

NameTypeDescription

callee

address

The callee's address.

blacklisted

bool

The status to set to callee.

Emits

LogChangeBlacklistedCallee

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

NameTypeDescription

elastic

uint128

The total amount of asset tokens held by minters.

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

NameTypeDescription

lastAccrued

uint64

The timestamp of the last accrue call.

feesEarned

uint128

The fees earned between the last withdrawal and the last accrue call.

interest

uint64

The accrued interest.

permissionControl

PermissionControl public permissionControl;

Description

See PermissionControl.

mintLimit

MintCap public mintLimit;

Description

The current mint limit (in mint parts).

Properties

NameTypeDescription

total

uint128

The mint limit on the total amount of asset tokens in the contract's balance.

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

NameTypeDescription

user

address

The address to check.

onlyLiquidators

modifier onlyLiquidators(address liquidator)

Description

Checks if liquidator is a liquidator.

Parameters

NameTypeDescription

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

NameTypeIndex?

accruedAmount

uint256

No

LogExchangeRate

event LogExchangeRate(uint256 rate);

Parameters

NameTypeIndex?

rate

uint256

No

LogAddCollateral

event LogAddCollateral(
    address indexed from,
    address indexed to,
    uint256 share
)

Parameters

NameTypeIndex?

from

address

Yes

to

address

Yes

share

uint256

No

LogRemoveCollateral

event LogRemoveCollateral(
    address indexed from,
    address indexed to,
    uint256 share
)

Parameters

NameTypeIndex?

from

address

Yes

to

address

Yes

share

uint256

No

LogMint

event LogMint(
    address indexed from,
    address indexed to,
    uint256 amount,
    uint256 part
)

Parameters

NameTypeIndex?

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

NameTypeIndex?

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

NameTypeIndex?

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

NameTypeIndex?

feeTo

address

Yes

feesEarnedFraction

uint256

No

LogFeeTo

event LogFeeTo(address indexed newFeeTo);

Parameters

NameTypeIndex?

newFeeTo

address

Yes

LogInterestChange

event LogInterestChange(
    uint64 oldInterestRate,
    uint64 newInterestRate
);

Parameters

NameTypeIndex?

oldInterestRate

uint64

No

newInterestRate

uint64

No

LogChangeMintLimit

event LogChangeMintLimit(
    uint128 newLimit,
    uint128 perAddressPart
);

Parameters

NameTypeIndex?

newLimit

uint128

No

perAddressPart

uint128

No

LogChangeBlacklistedCallee

event LogChangeBlacklistedCallee(
    address indexed account,
    bool blacklisted
);

Parameters

NameTypeIndex?

account

address

Yes

blacklisted

bool

No

LogChangePermissionControl

event LogChangePermissionControl(PermissionControl indexed newPermissionControl);

Parameters

NameTypeIndex?

newPermissionControl

PermissionControl

Yes

Last updated