Skip to main content

IPegStabilityModule

The Fei PSM is a contract which holds a reserve of assets in order to exchange FEI at $1 of underlying assets with a fee. mint() - buy FEI for $1 of underlying tokens redeem() - sell FEI 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 amountFeiOut)

mint amountFeiOut FEI to address to for amountIn underlying tokens

see getMintAmountOut() to pre-calculate amount out

Parameters

NameTypeDescription
toaddress
amountInuint256
minAmountOutuint256

redeem

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

redeem amountFeiIn FEI for amountOut underlying tokens and send to address to

see getRedeemAmountOut() to pre-calculate amount out

Parameters

NameTypeDescription
toaddress
amountFeiInuint256
minAmountOutuint256

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
newMintFeeBasisPointsuint256

setRedeemFee

function setRedeemFee(
uint256 newRedeemFeeBasisPoints
) external

set the redemption fee vs oracle price in basis point terms

Parameters

NameTypeDescription
newRedeemFeeBasisPointsuint256

setReservesThreshold

function setReservesThreshold(
uint256 newReservesThreshold
) external

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

Parameters

NameTypeDescription
newReservesThresholduint256

setSurplusTarget

function setSurplusTarget(
contract IPCVDeposit newTarget
) external

set the target for sending surplus reserves

Parameters

NameTypeDescription
newTargetcontract IPCVDeposit

getMintAmountOut

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

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

Parameters

NameTypeDescription
amountInuint256

getRedeemAmountOut

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

calculate the amount of underlying out for a given amountFeiIn of FEI

Parameters

NameTypeDescription
amountFeiInuint256

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 FEI

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
calleraddress
amountuint256

MaxFeeUpdate

event MaxFeeUpdate(
uint256 oldMaxFee,
uint256 newMaxFee
)

event emitted when a new max fee is set

Parameters

NameTypeDescription
oldMaxFeeuint256
newMaxFeeuint256

MintFeeUpdate

event MintFeeUpdate(
uint256 oldMintFee,
uint256 newMintFee
)

event emitted when a new mint fee is set

Parameters

NameTypeDescription
oldMintFeeuint256
newMintFeeuint256

RedeemFeeUpdate

event RedeemFeeUpdate(
uint256 oldRedeemFee,
uint256 newRedeemFee
)

event emitted when a new redeem fee is set

Parameters

NameTypeDescription
oldRedeemFeeuint256
newRedeemFeeuint256

ReservesThresholdUpdate

event ReservesThresholdUpdate(
uint256 oldReservesThreshold,
uint256 newReservesThreshold
)

event emitted when reservesThreshold is updated

Parameters

NameTypeDescription
oldReservesThresholduint256
newReservesThresholduint256

SurplusTargetUpdate

event SurplusTargetUpdate(
contract IPCVDeposit oldTarget,
contract IPCVDeposit newTarget
)

event emitted when surplus target is updated

Parameters

NameTypeDescription
oldTargetcontract IPCVDeposit
newTargetcontract IPCVDeposit

Redeem

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

event emitted upon a redemption

Parameters

NameTypeDescription
toaddress
amountFeiInuint256
amountAssetOutuint256

Mint

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

event emitted when fei gets minted

Parameters

NameTypeDescription
toaddress
amountInuint256
amountFeiOutuint256