IPegStabilityModule

The Chi PSM is a contract which holds a reserve of assets in order to exchange CHI at $1 of underlying assets with a fee. mint() - buy CHI for $1 of underlying tokens redeem() - sell CHI back for $1 of the same

The contract has a reservesThreshold() of underlying meant to stand ready for redemptions. Any surplus reserves can be sent into the PCV using allocateSurplus()

The contract is a PCVDeposit - to track reserves OracleRef - to determine price of underlying, and RateLimitedMinter - to stop infinite mints and related issues (but this is in the implementation due to inheritance-linearization difficulties)

Inspired by MakerDAO PSM, code written without reference

Functions

mint

function mint(
    address to,
    uint256 amountIn,
    uint256 minAmountOut
) external returns (uint256 amountChiOut)

mint amountChiOut CHI to address to for amountIn underlying tokens

see getMintAmountOut() to pre-calculate amount out

Parameters

NameTypeDescription

to

address

amountIn

uint256

minAmountOut

uint256

redeem

function redeem(
    address to,
    uint256 amountChiIn,
    uint256 minAmountOut
) external returns (uint256 amountOut)

redeem amountChiIn CHI for amountOut underlying tokens and send to address to

see getRedeemAmountOut() to pre-calculate amount out

Parameters

NameTypeDescription

to

address

amountChiIn

uint256

minAmountOut

uint256

allocateSurplus

function allocateSurplus() external

send any surplus reserves to the PCV allocation

setMintFee

function setMintFee(
    uint256 newMintFeeBasisPoints
) external

set the mint fee vs oracle price in basis point terms

Parameters

NameTypeDescription

newMintFeeBasisPoints

uint256

setRedeemFee

function setRedeemFee(
    uint256 newRedeemFeeBasisPoints
) external

set the redemption fee vs oracle price in basis point terms

Parameters

NameTypeDescription

newRedeemFeeBasisPoints

uint256

setReservesThreshold

function setReservesThreshold(
    uint256 newReservesThreshold
) external

set the ideal amount of reserves for the contract to hold for redemptions

Parameters

NameTypeDescription

newReservesThreshold

uint256

setSurplusTarget

function setSurplusTarget(
    contract IPCVDeposit newTarget
) external

set the target for sending surplus reserves

Parameters

NameTypeDescription

newTarget

contract IPCVDeposit

getMintAmountOut

function getMintAmountOut(
    uint256 amountIn
) external returns (uint256 amountChiOut)

calculate the amount of CHI out for a given amountIn of underlying

Parameters

NameTypeDescription

amountIn

uint256

getRedeemAmountOut

function getRedeemAmountOut(
    uint256 amountChiIn
) external returns (uint256 amountOut)

calculate the amount of underlying out for a given amountChiIn of CHI

Parameters

NameTypeDescription

amountChiIn

uint256

getMaxMintAmountOut

function getMaxMintAmountOut() external returns (uint256)

the maximum mint amount out

hasSurplus

function hasSurplus() external returns (bool)

a flag for whether the current balance is above (true) or below and equal (false) to the reservesThreshold

reservesSurplus

function reservesSurplus() external returns (int256)

an integer representing the positive surplus or negative deficit of contract balance vs reservesThreshold

reservesThreshold

function reservesThreshold() external returns (uint256)

the ideal amount of reserves for the contract to hold for redemptions

mintFeeBasisPoints

function mintFeeBasisPoints() external returns (uint256)

the mint fee vs oracle price in basis point terms

redeemFeeBasisPoints

function redeemFeeBasisPoints() external returns (uint256)

the redemption fee vs oracle price in basis point terms

underlyingToken

function underlyingToken() external returns (contract IERC20)

the underlying token exchanged for CHI

surplusTarget

function surplusTarget() external returns (contract IPCVDeposit)

the PCV deposit target to send surplus reserves

MAX_FEE

function MAX_FEE() external returns (uint256)

the max mint and redeem fee in basis points

Events

AllocateSurplus

event AllocateSurplus(
    address caller,
    uint256 amount
)

event emitted when excess PCV is allocated

Parameters

NameTypeDescription

caller

address

amount

uint256

### MaxFeeUpdate

event MaxFeeUpdate(
    uint256 oldMaxFee,
    uint256 newMaxFee
)

event emitted when a new max fee is set

Parameters

NameTypeDescription

oldMaxFee

uint256

newMaxFee

uint256

### MintFeeUpdate

event MintFeeUpdate(
    uint256 oldMintFee,
    uint256 newMintFee
)

event emitted when a new mint fee is set

Parameters

NameTypeDescription

oldMintFee

uint256

newMintFee

uint256

### RedeemFeeUpdate

event RedeemFeeUpdate(
    uint256 oldRedeemFee,
    uint256 newRedeemFee
)

event emitted when a new redeem fee is set

Parameters

NameTypeDescription

oldRedeemFee

uint256

newRedeemFee

uint256

### ReservesThresholdUpdate

event ReservesThresholdUpdate(
    uint256 oldReservesThreshold,
    uint256 newReservesThreshold
)

event emitted when reservesThreshold is updated

Parameters

NameTypeDescription

oldReservesThreshold

uint256

newReservesThreshold

uint256

### SurplusTargetUpdate

event SurplusTargetUpdate(
    contract IPCVDeposit oldTarget,
    contract IPCVDeposit newTarget
)

event emitted when surplus target is updated

Parameters

NameTypeDescription

oldTarget

contract IPCVDeposit

newTarget

contract IPCVDeposit

### Redeem

event Redeem(
    address to,
    uint256 amountChiIn,
    uint256 amountAssetOut
)

event emitted upon a redemption

Parameters

NameTypeDescription

to

address

amountChiIn

uint256

amountAssetOut

uint256

### Mint

event Mint(
    address to,
    uint256 amountIn,
    uint256 amountChiOut
)

event emitted when chi gets minted

Parameters

NameTypeDescription

to

address

amountIn

uint256

amountChiOut

uint256

Last updated