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
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
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
newMintFeeBasisPoints
uint256
setRedeemFee
function setRedeemFee(
uint256 newRedeemFeeBasisPoints
) external
set the redemption fee vs oracle price in basis point terms
Parameters
newRedeemFeeBasisPoints
uint256
setReservesThreshold
function setReservesThreshold(
uint256 newReservesThreshold
) external
set the ideal amount of reserves for the contract to hold for redemptions
Parameters
newReservesThreshold
uint256
setSurplusTarget
function setSurplusTarget(
contract IPCVDeposit newTarget
) external
set the target for sending surplus reserves
Parameters
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
amountIn
uint256
getRedeemAmountOut
function getRedeemAmountOut(
uint256 amountChiIn
) external returns (uint256 amountOut)
calculate the amount of underlying out for a given amountChiIn
of CHI
Parameters
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
caller
address
amount
uint256
### MaxFeeUpdate
event MaxFeeUpdate(
uint256 oldMaxFee,
uint256 newMaxFee
)
event emitted when a new max fee is set
Parameters
oldMaxFee
uint256
newMaxFee
uint256
### MintFeeUpdate
event MintFeeUpdate(
uint256 oldMintFee,
uint256 newMintFee
)
event emitted when a new mint fee is set
Parameters
oldMintFee
uint256
newMintFee
uint256
### RedeemFeeUpdate
event RedeemFeeUpdate(
uint256 oldRedeemFee,
uint256 newRedeemFee
)
event emitted when a new redeem fee is set
Parameters
oldRedeemFee
uint256
newRedeemFee
uint256
### ReservesThresholdUpdate
event ReservesThresholdUpdate(
uint256 oldReservesThreshold,
uint256 newReservesThreshold
)
event emitted when reservesThreshold is updated
Parameters
oldReservesThreshold
uint256
newReservesThreshold
uint256
### SurplusTargetUpdate
event SurplusTargetUpdate(
contract IPCVDeposit oldTarget,
contract IPCVDeposit newTarget
)
event emitted when surplus target is updated
Parameters
oldTarget
contract IPCVDeposit
newTarget
contract IPCVDeposit
### Redeem
event Redeem(
address to,
uint256 amountChiIn,
uint256 amountAssetOut
)
event emitted upon a redemption
Parameters
to
address
amountChiIn
uint256
amountAssetOut
uint256
### Mint
event Mint(
address to,
uint256 amountIn,
uint256 amountChiOut
)
event emitted when chi gets minted
Parameters
to
address
amountIn
uint256
amountChiOut
uint256
Last updated