LogoLogo
  • Core contracts
    • CMPVault
    • Oracle
      • FAQ
  • Pheriphery contracts
    • Operatable
      • PermissionControl
  • Deployments
    • Ethereum Mainnet
  • User Documentation
Powered by GitBook
On this page
  • Initialization
  • constructor
  • initialize
  • Write Methods
  • accrue
  • updateExchangeRate
  • addCollateral
  • removeCollateral
  • mint
  • returning
  • manage
  • liquidate
  • withdrawFees
  • setFeeTo
  • reduceSupply
  • changeInterestRate
  • changeMintLimit
  • changePermissionControl
  • setBlacklistedCallee
  • View Methods
  • asset
  • collateral
  • userMintPart
  • userCollateralAmount
  • totalMint
  • totalCollateralAmount
  • feeTo
  • oracle
  • oracleData
  • blacklistedCallees
  • accrueInfo
  • permissionControl
  • mintLimit
  • COLLATERALIZATION_RATE
  • LIQUIDATION_MULTIPLIER
  • MINT_OPENING_RETURN_FEE
  • Modifiers
  • onlyWhitelisted
  • onlyLiquidators
  • solvent
  • Events
  • LogAccrue
  • LogExchangeRate
  • LogAddCollateral
  • LogRemoveCollateral
  • LogMint
  • LogReturn
  • LogLiquidation
  • LogWithdrawFees
  • LogFeeTo
  • LogInterestChange
  • LogChangeMintLimit
  • LogChangeBlacklistedCallee
  • LogChangePermissionControl
  1. Core contracts

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

updateExchangeRate

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

Description

Returns

Name
Type
Description

updated

bool

A boolean indicating whether the exchange rate update was successful.

rate

uint256

Emits

addCollateral

function addCollateral(address to, uint256 share)
    public virtual onlyWhitelisted(to)

Description

Your smart contract must approveaddress(this) to transfer the shares:

collateral.approve(address(CMPVault), share);

Parameters

Name
Type
Description

to

address

share

uint256

The amount of tokens to add.

Emits

removeCollateral

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

Description

Parameters

Name
Type
Description

to

address

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

Parameters

Name
Type
Description

to

address

amount

uint256

Returns

Name
Type
Description

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

Name
Type
Description

to

address

The address for which to return the loan.

part

uint256

Returns

Name
Type
Description

amount

uint256

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.

Action
ID
Parameters
ABI encoding
value1
value2

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

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

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

Emits

setFeeTo

function setFeeTo(address newFeeTo) public onlyOwner

Description

Allows owner to change the recipient of the fees.

Parameters

Name
Type
Description

newFeeTo

address

Emits

reduceSupply

function reduceSupply(uint256 amount) public onlyOwner

Description

Parameters

Name
Type
Description

amount

uint256

changeInterestRate

function changeInterestRate(uint64 newInterestRate) public onlyOwner

Description

Allows owner to change the interest rate.

Parameters

Name
Type
Description

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

Name
Type
Description

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

Name
Type
Description

newPermissionControl

PermissionControl

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

Name
Type
Description

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

userMintPart

mapping(address => uint256) public userMintPart;

Description

Maps each user to its total debt (i.e. its mint part).

totalMint.elastic / totalMint.base * userMintPart[user]

userCollateralAmount

mapping(address => uint256) public userCollateralAmount;

Description

totalMint

Rebase public totalMint;

Description

Represents the total loan held by minters.

Properties

Name
Type
Description

elastic

uint128

base

uint128

The total amount of mint parts held by minters.

totalCollateralAmount

uint256 public totalCollateralAmount;

Description

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

blacklistedCallees

mapping(address => bool) public blacklistedCallees;

Description

accrueInfo

AccrueInfo public accrueInfo;

Description

Properties

Name
Type
Description

lastAccrued

uint64

feesEarned

uint128

interest

uint64

The accrued interest.

permissionControl

PermissionControl public permissionControl;

Description

mintLimit

MintCap public mintLimit;

Description

The current mint limit (in mint parts).

Properties

Name
Type
Description

total

uint128

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

Name
Type
Description

user

address

The address to check.

onlyLiquidators

modifier onlyLiquidators(address liquidator)

Description

Checks if liquidator is a liquidator.

Parameters

Name
Type
Description

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

Name
Type
Index?

accruedAmount

uint256

No

LogExchangeRate

event LogExchangeRate(uint256 rate);

Parameters

Name
Type
Index?

rate

uint256

No

LogAddCollateral

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

Parameters

Name
Type
Index?

from

address

Yes

to

address

Yes

share

uint256

No

LogRemoveCollateral

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

Parameters

Name
Type
Index?

from

address

Yes

to

address

Yes

share

uint256

No

LogMint

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

Parameters

Name
Type
Index?

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

Name
Type
Index?

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

Name
Type
Index?

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

Name
Type
Index?

feeTo

address

Yes

feesEarnedFraction

uint256

No

LogFeeTo

event LogFeeTo(address indexed newFeeTo);

Parameters

Name
Type
Index?

newFeeTo

address

Yes

LogInterestChange

event LogInterestChange(
    uint64 oldInterestRate,
    uint64 newInterestRate
);

Parameters

Name
Type
Index?

oldInterestRate

uint64

No

newInterestRate

uint64

No

LogChangeMintLimit

event LogChangeMintLimit(
    uint128 newLimit,
    uint128 perAddressPart
);

Parameters

Name
Type
Index?

newLimit

uint128

No

perAddressPart

uint128

No

LogChangeBlacklistedCallee

event LogChangeBlacklistedCallee(
    address indexed account,
    bool blacklisted
);

Parameters

Name
Type
Index?

account

address

Yes

blacklisted

bool

No

LogChangePermissionControl

event LogChangePermissionControl(PermissionControl indexed newPermissionControl);

Parameters

Name
Type
Index?

newPermissionControl

PermissionControl

Yes

NextOracle

Last updated 1 year ago

Updates the exchange rate (see ).

The latest exchange rate fetched from the smart contract.

Adds a share amount of token to to.

The receiver of the tokens.

Removes a share amount of token from msg.sender.

The receiver of the tokens.

Mints an amount of tokens.

The receiver of the tokens.

The amount of tokens to mint.

The amount to return (see ).

The amount of tokens that has been returned.

Transfers all available fees to .

The new recipient (see ).

Reduce the available supply of tokens.

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

The new permission control contract (see ).

The ERC20 token that acts as collateral to mint tokens.

You can convert this number into a numerical amount of tokens with:

Maps each user to its amount of tokens.

The total amount of tokens held by minters.

The total amount of tokens.

The ABI encoding to pass to the get function.

If an address maps to true all Call actions to its functions are forbidden.

Some data about the function.

The timestamp of the last call.

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

See .

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

PermissionControl
LogAccrue
oracle
LogExchangeRate
collateral
LogAddCollateral
collateral
LogRemoveCollateral
asset
LogAccrue
LogMint
LogAccrue
LogReturn
LogRemoveCollateral
LogReturn
LogLiquidation
feeTo
LogAccrue
LogWithdrawFees
LogFeeTo
asset
LogInterestChange
LogChangeMintLimit
LogChangePermissionControl
LogChangeBlacklistedCallee
asset
asset
collateral
collateral
oracle
manage
accrue
oracle
collateral
collateral
asset
asset
userMintPart
asset
feeTo
asset
permissionControl
asset
accrue
accrue
asset