Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KUSD mint cap #346

Merged
merged 9 commits into from
May 23, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions packages/contracts/contracts/BorrowerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import "./Interfaces/IKUMOStaking.sol";
import "./Interfaces/IStabilityPoolFactory.sol";
import "./Dependencies/KumoBase.sol";
import "./Dependencies/CheckContract.sol";
// import "./Dependencies/console.sol";
import "hardhat/console.sol";
import "./Dependencies/SafeMath.sol";
import "./Dependencies/SafetyTransfer.sol";

Expand Down Expand Up @@ -176,6 +176,7 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
address _upperHint,
address _lowerHint
) external payable override assetIsInitialized(_asset) {
checkKUSDMintCap(_asset, _KUSDAmount);
kumoParams.sanitizeParameters(_asset);
ContractsCache memory contractsCache = ContractsCache(
troveManager,
Expand Down Expand Up @@ -311,6 +312,7 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
address _upperHint,
address _lowerHint
) external override {
checkKUSDMintCap(_asset, _KUSDAmount);
_adjustTrove(
_asset,
0,
Expand Down Expand Up @@ -344,6 +346,10 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
address _upperHint,
address _lowerHint
) external payable override {
if (_isDebtIncrease) {
checkKUSDMintCap(_asset, _KUSDChange);
}

_adjustTrove(
_asset,
_assetSent,
Expand Down Expand Up @@ -586,11 +592,10 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
return usdValue;
}

function _getCollChange(uint256 _collReceived, uint256 _requestedCollWithdrawal)
internal
pure
returns (uint256 collChange, bool isCollIncrease)
{
function _getCollChange(
uint256 _collReceived,
uint256 _requestedCollWithdrawal
) internal pure returns (uint256 collChange, bool isCollIncrease) {
if (_collReceived != 0) {
collChange = _collReceived;
isCollIncrease = true;
Expand Down Expand Up @@ -644,11 +649,7 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
}

// Send ETH to Active Pool and increase its recorded ETH balance
function _activePoolAddColl(
address _asset,
IActivePool _activePool,
uint256 _amount
) internal {
function _activePoolAddColl(address _asset, IActivePool _activePool, uint256 _amount) internal {
// (bool success, ) = address(_activePool).call{value: _amount}("");
// require(success, "BorrowerOps: Sending ETH to ActivePool failed");
IERC20Upgradeable(_asset).safeTransferFrom(
Expand Down Expand Up @@ -684,6 +685,10 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
_kusdToken.burn(_account, _KUSD);
}

function KUSDMintRemainder(address _asset) external view returns (uint256) {
return kumoParams.KUSDMintCap(_asset) - kusdToken.totalSupply();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@arthurka-o - do we need to check for a negative return value? My concerns are if fees could play in here. What do you think?

}

// --- 'Require' wrapper functions ---

function _requireSingularCollChange(uint256 _collWithdrawal, uint256 _amountSent) internal view {
Expand Down Expand Up @@ -954,12 +959,17 @@ contract BorrowerOperations is KumoBase, CheckContract, IBorrowerOperations {
return newTCR;
}

function getCompositeDebt(address _asset, uint256 _debt)
external
view
override
returns (uint256)
{
function getCompositeDebt(
address _asset,
uint256 _debt
) external view override returns (uint256) {
return _getCompositeDebt(_asset, _debt);
}

function checkKUSDMintCap(address _asset, uint256 _KUSDAmount) internal {
require(
kusdToken.totalSupply() + _KUSDAmount <= kumoParams.KUSDMintCap(_asset),
"KUSD mint cap is reached for this asset"
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,6 @@ interface IBorrowerOperations {
function claimCollateral(address _asset) external;

function getCompositeDebt(address _asset, uint256 _debt) external view returns (uint256);

function KUSDMintRemainder(address _asset) external view returns (uint256);
}
29 changes: 15 additions & 14 deletions packages/contracts/contracts/Interfaces/IKumoParameters.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ interface IKumoParameters {
event RedemptionFeeFloorChanged(uint256 oldRedemptionFeeFloor, uint256 newRedemptionFeeFloor);
event RedemptionBlockRemoved(address _asset);
event PriceFeedChanged(address indexed addr);
event KUSDMintCapChanged(address _asset, uint256 oldMintCap, uint256 newMintCap);

function BOOTSTRAP_PERIOD() external view returns (uint256);

Expand All @@ -29,36 +30,34 @@ interface IKumoParameters {
function _100pct() external view returns (uint256);

// Minimum collateral ratio for individual troves
function MCR(address _collateral) external view returns (uint256);
function MCR(address _asset) external view returns (uint256);

// Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered.
function CCR(address _collateral) external view returns (uint256);
function CCR(address _asset) external view returns (uint256);

function KUSD_GAS_COMPENSATION(address _collateral) external view returns (uint256);
function KUSD_GAS_COMPENSATION(address _asset) external view returns (uint256);

function MIN_NET_DEBT(address _collateral) external view returns (uint256);
function MIN_NET_DEBT(address _asset) external view returns (uint256);

function PERCENT_DIVISOR(address _collateral) external view returns (uint256);
function PERCENT_DIVISOR(address _asset) external view returns (uint256);

function BORROWING_FEE_FLOOR(address _collateral) external view returns (uint256);
function BORROWING_FEE_FLOOR(address _asset) external view returns (uint256);

function REDEMPTION_FEE_FLOOR(address _collateral) external view returns (uint256);
function REDEMPTION_FEE_FLOOR(address _asset) external view returns (uint256);

function MAX_BORROWING_FEE(address _collateral) external view returns (uint256);
function MAX_BORROWING_FEE(address _asset) external view returns (uint256);

function redemptionBlock(address _collateral) external view returns (uint256);
function KUSDMintCap(address _asset) external view returns (uint256);

function redemptionBlock(address _asset) external view returns (uint256);

function activePool() external view returns (IActivePool);

function defaultPool() external view returns (IDefaultPool);

function priceFeed() external view returns (IPriceFeed);

function setAddresses(
address _activePool,
address _defaultPool,
address _priceFeed
) external;
function setAddresses(address _activePool, address _defaultPool, address _priceFeed) external;

function setPriceFeed(address _priceFeed) external;

Expand All @@ -84,6 +83,8 @@ interface IKumoParameters {

function setRedemptionFeeFloor(address _asset, uint256 redemptionFeeFloor) external;

function setKUSDMintCap(address _asset, uint256 _newCap) external;

function removeRedemptionBlock(address _asset) external;

function hasCollateralConfigured(address _asset) external view returns (bool);
Expand Down
61 changes: 43 additions & 18 deletions packages/contracts/contracts/KumoParameters.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
uint256 public constant MAX_BORROWING_FEE_DEFAULT = (DECIMAL_PRECISION / 100) * 5; // 5%

uint256 public constant REDEMPTION_FEE_FLOOR_DEFAULT = (DECIMAL_PRECISION / 1000) * 5; // 0.5%
uint256 public constant KUSD_MINT_CAP_DEFAULT = 10000000 * 10e18; // 10M

// KUSD mint caps per asset
mapping(address => uint256) public KUSDMintCap;
// Minimum collateral ratio for individual troves
mapping(address => uint256) public override MCR;
// Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered.
Expand Down Expand Up @@ -120,6 +123,7 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
BORROWING_FEE_FLOOR[_asset] = BORROWING_FEE_FLOOR_DEFAULT;
MAX_BORROWING_FEE[_asset] = MAX_BORROWING_FEE_DEFAULT;
REDEMPTION_FEE_FLOOR[_asset] = REDEMPTION_FEE_FLOOR_DEFAULT;
KUSDMintCap[_asset] = KUSD_MINT_CAP_DEFAULT;
}

function setCollateralParameters(
Expand All @@ -145,7 +149,10 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
setRedemptionFeeFloor(_asset, redemptionFeeFloor);
}

function setMCR(address _asset, uint256 newMCR)
function setMCR(
address _asset,
uint256 newMCR
)
public
override
onlyOwner
Expand All @@ -157,7 +164,10 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit MCRChanged(oldMCR, newMCR);
}

function setCCR(address _asset, uint256 newCCR)
function setCCR(
address _asset,
uint256 newCCR
)
public
override
onlyOwner
Expand All @@ -169,19 +179,20 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit CCRChanged(oldCCR, newCCR);
}

function setPercentDivisor(address _asset, uint256 precentDivisor)
public
override
onlyOwner
safeCheck("Percent Divisor", _asset, precentDivisor, 2, 200)
{
function setPercentDivisor(
address _asset,
uint256 precentDivisor
) public override onlyOwner safeCheck("Percent Divisor", _asset, precentDivisor, 2, 200) {
uint256 oldPercent = PERCENT_DIVISOR[_asset];
PERCENT_DIVISOR[_asset] = precentDivisor;

emit PercentDivisorChanged(oldPercent, precentDivisor);
}

function setBorrowingFeeFloor(address _asset, uint256 borrowingFeeFloor)
function setBorrowingFeeFloor(
address _asset,
uint256 borrowingFeeFloor
)
public
override
onlyOwner
Expand All @@ -195,7 +206,10 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit BorrowingFeeFloorChanged(oldBorrowing, newBorrowingFee);
}

function setMaxBorrowingFee(address _asset, uint256 maxBorrowingFee)
function setMaxBorrowingFee(
address _asset,
uint256 maxBorrowingFee
)
public
override
onlyOwner
Expand All @@ -208,7 +222,10 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit MaxBorrowingFeeChanged(oldMaxBorrowingFee, newMaxBorrowingFee);
}

function setKUMOGasCompensation(address _asset, uint256 gasCompensation)
function setKUMOGasCompensation(
address _asset,
uint256 gasCompensation
)
public
override
onlyOwner
Expand All @@ -220,19 +237,20 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit GasCompensationChanged(oldGasComp, gasCompensation);
}

function setMinNetDebt(address _asset, uint256 minNetDebt)
public
override
onlyOwner
safeCheck("Min Net Debt", _asset, minNetDebt, 0, 1800 ether)
{
function setMinNetDebt(
address _asset,
uint256 minNetDebt
) public override onlyOwner safeCheck("Min Net Debt", _asset, minNetDebt, 0, 1800 ether) {
uint256 oldMinNet = MIN_NET_DEBT[_asset];
MIN_NET_DEBT[_asset] = minNetDebt;

emit MinNetDebtChanged(oldMinNet, minNetDebt);
}

function setRedemptionFeeFloor(address _asset, uint256 redemptionFeeFloor)
function setRedemptionFeeFloor(
address _asset,
uint256 redemptionFeeFloor
)
public
override
onlyOwner
Expand All @@ -245,6 +263,13 @@ contract KumoParameters is IKumoParameters, Ownable, CheckContract {
emit RedemptionFeeFloorChanged(oldRedemptionFeeFloor, newRedemptionFeeFloor);
}

function setKUSDMintCap(address _asset, uint256 _newCap) public onlyOwner {
uint256 _oldCap = KUSDMintCap[_asset];
KUSDMintCap[_asset] = _newCap;

emit KUSDMintCapChanged(_asset, _oldCap, _newCap);
}

function removeRedemptionBlock(address _asset) external override onlyOwner {
redemptionBlock[_asset] = block.timestamp;

Expand Down
Loading