Skip to content

Commit

Permalink
🥝 Remove gas compensation (#2)
Browse files Browse the repository at this point in the history
* 🥝 Remove gas compensation

* Remove gas compensation from tests

* Fix test for vessel recovery mode

* Fix all tests

* Remove apply liquidation fee helper

* Remove unused code from contracts

* Restore ordering test

* Remove mentions of gas compensation
  • Loading branch information
Szymx95 authored Apr 29, 2024
1 parent e678520 commit 76dbbdd
Show file tree
Hide file tree
Showing 21 changed files with 271 additions and 2,042 deletions.
4 changes: 0 additions & 4 deletions contracts/AdminContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -301,10 +301,6 @@ contract AdminContract is IAdminContract, UUPSUpgradeable, OwnableUpgradeable, A
return collateralParams[_collateral].ccr;
}

function getDebtTokenGasCompensation(address _collateral) external view override returns (uint256) {
return collateralParams[_collateral].debtTokenGasCompensation;
}

function getMinNetDebt(address _collateral) external view override returns (uint256) {
return collateralParams[_collateral].minNetDebt;
}
Expand Down
41 changes: 12 additions & 29 deletions contracts/BorrowerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr
uint256 price;
uint256 debtTokenFee;
uint256 netDebt;
uint256 compositeDebt;
uint256 ICR;
uint256 NICR;
uint256 stake;
Expand Down Expand Up @@ -89,26 +88,24 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr
}
_requireAtLeastMinNetDebt(vars.asset, vars.netDebt);

// ICR is based on the composite debt, i.e. the requested debt token amount + borrowing fee + gas comp.
uint256 gasCompensation = IAdminContract(adminContract).getDebtTokenGasCompensation(vars.asset);
vars.compositeDebt = vars.netDebt + gasCompensation;
require(vars.compositeDebt != 0, "compositeDebt cannot be 0");
// ICR is based on the debt, i.e. the requested debt token amount + borrowing fee.
require(vars.netDebt != 0, "Debt cannot be 0");

vars.ICR = TrinityMath._computeCR(_assetAmount, vars.compositeDebt, vars.price);
vars.NICR = TrinityMath._computeNominalCR(_assetAmount, vars.compositeDebt);
vars.ICR = TrinityMath._computeCR(_assetAmount, vars.netDebt, vars.price);
vars.NICR = TrinityMath._computeNominalCR(_assetAmount, vars.netDebt);

if (isRecoveryMode) {
_requireICRisAboveCCR(vars.asset, vars.ICR);
} else {
_requireICRisAboveMCR(vars.asset, vars.ICR);
uint256 newTCR = _getNewTCRFromVesselChange(vars.asset, _assetAmount, true, vars.compositeDebt, true, vars.price); // bools: coll increase, debt increase
uint256 newTCR = _getNewTCRFromVesselChange(vars.asset, _assetAmount, true, vars.netDebt, true, vars.price); // bools: coll increase, debt increase
_requireNewTCRisAboveCCR(vars.asset, newTCR);
}

// Set the vessel struct's properties
IVesselManager(vesselManager).setVesselStatus(vars.asset, msg.sender, 1); // Vessel Status 1 = Active
IVesselManager(vesselManager).increaseVesselColl(vars.asset, msg.sender, _assetAmount);
IVesselManager(vesselManager).increaseVesselDebt(vars.asset, msg.sender, vars.compositeDebt);
IVesselManager(vesselManager).increaseVesselDebt(vars.asset, msg.sender, vars.netDebt);

IVesselManager(vesselManager).updateVesselRewardSnapshots(vars.asset, msg.sender);
vars.stake = IVesselManager(vesselManager).updateStakeAndTotalStakes(vars.asset, msg.sender);
Expand All @@ -120,15 +117,11 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr
// Move the asset to the Active Pool, and mint the debtToken amount to the borrower
_activePoolAddColl(vars.asset, _assetAmount);
_withdrawDebtTokens(vars.asset, msg.sender, _debtTokenAmount, vars.netDebt);
// Move the debtToken gas compensation to the Gas Pool
if (gasCompensation != 0) {
_withdrawDebtTokens(vars.asset, gasPoolAddress, gasCompensation, gasCompensation);
}

emit VesselUpdated(
vars.asset,
msg.sender,
vars.compositeDebt,
vars.netDebt,
_assetAmount,
vars.stake,
BorrowerOperation.openVessel
Expand Down Expand Up @@ -260,7 +253,7 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr

// When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough debt tokens
if (!_isDebtIncrease && _debtTokenChange != 0) {
_requireAtLeastMinNetDebt(vars.asset, _getNetDebt(vars.asset, vars.debt) - vars.netDebtChange);
_requireAtLeastMinNetDebt(vars.asset, vars.debt - vars.netDebtChange);
_requireValidDebtTokenRepayment(vars.asset, vars.debt, vars.netDebtChange);
_requireSufficientDebtTokenBalance(_borrower, vars.netDebtChange);
}
Expand Down Expand Up @@ -310,10 +303,7 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr
uint256 coll = IVesselManager(vesselManager).getVesselColl(_asset, msg.sender);
uint256 debt = IVesselManager(vesselManager).getVesselDebt(_asset, msg.sender);

uint256 gasCompensation = IAdminContract(adminContract).getDebtTokenGasCompensation(_asset);
uint256 netDebt = debt - gasCompensation;

_requireSufficientDebtTokenBalance(msg.sender, netDebt);
_requireSufficientDebtTokenBalance(msg.sender, debt);

uint256 newTCR = _getNewTCRFromVesselChange(_asset, coll, false, debt, false, price);
_requireNewTCRisAboveCCR(_asset, newTCR);
Expand All @@ -323,11 +313,8 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr

emit VesselUpdated(_asset, msg.sender, 0, 0, 0, BorrowerOperation.closeVessel);

// Burn the repaid debt tokens from the user's balance and the gas compensation from the Gas Pool
_repayDebtTokens(_asset, msg.sender, netDebt);
if (gasCompensation != 0) {
_repayDebtTokens(_asset, gasPoolAddress, gasCompensation);
}
// Burn the repaid debt tokens from the user's balance
_repayDebtTokens(_asset, msg.sender, debt);

// Send the collateral back to the user
IActivePool(activePool).sendAsset(_asset, msg.sender, coll);
Expand Down Expand Up @@ -586,7 +573,7 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr

function _requireValidDebtTokenRepayment(address _asset, uint256 _currentDebt, uint256 _debtRepayment) internal view {
require(
_debtRepayment <= _currentDebt - IAdminContract(adminContract).getDebtTokenGasCompensation(_asset),
_debtRepayment <= _currentDebt,
"BorrowerOps: Amount repaid must not be larger than the Vessel's debt"
);
}
Expand Down Expand Up @@ -680,10 +667,6 @@ contract BorrowerOperations is TrinityBase, ReentrancyGuardUpgradeable, UUPSUpgr
return newTCR;
}

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

function authorizeUpgrade(address newImplementation) public {
_authorizeUpgrade(newImplementation);
}
Expand Down
16 changes: 0 additions & 16 deletions contracts/Dependencies/TrinityBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,6 @@ import "../Addresses.sol";
* common functions.
*/
abstract contract TrinityBase is ITrinityBase, BaseMath, OwnableUpgradeable, Addresses {
// --- Gas compensation functions ---

// Returns the composite debt (drawn debt + gas compensation) of a vessel, for the purpose of ICR calculation
function _getCompositeDebt(address _asset, uint256 _debt) internal view returns (uint256) {
return _debt + IAdminContract(adminContract).getDebtTokenGasCompensation(_asset);
}

function _getNetDebt(address _asset, uint256 _debt) internal view returns (uint256) {
return _debt - IAdminContract(adminContract).getDebtTokenGasCompensation(_asset);
}

// Return the amount of ETH to be drawn from a vessel's collateral and sent as gas compensation.
function _getCollGasCompensation(address _asset, uint256 _entireColl) internal view returns (uint256) {
return _entireColl / IAdminContract(adminContract).getPercentDivisor(_asset);
}

function getEntireSystemColl(address _asset) public view returns (uint256 entireSystemColl) {
uint256 activeColl = IActivePool(activePool).getAssetBalance(_asset);
uint256 liquidatedColl = IDefaultPool(defaultPool).getAssetBalance(_asset);
Expand Down
2 changes: 0 additions & 2 deletions contracts/Interfaces/IAdminContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,6 @@ interface IAdminContract {

function getCcr(address _collateral) external view returns (uint256);

function getDebtTokenGasCompensation(address _collateral) external view returns (uint256);

function getMinNetDebt(address _collateral) external view returns (uint256);

function getPercentDivisor(address _collateral) external view returns (uint256);
Expand Down
2 changes: 0 additions & 2 deletions contracts/Interfaces/IBorrowerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ interface IBorrowerOperations {

function claimCollateral(address _asset) external;

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

function collectVesselFee(
address _asset,
address _borrower
Expand Down
9 changes: 1 addition & 8 deletions contracts/Interfaces/IVesselManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ interface IVesselManager is ITrinityBase {
uint256 _collToSendToStabilityPool
) external;

function updateSystemSnapshots_excludeCollRemainder(address _asset, uint256 _collRemainder) external;
function updateSystemSnapshots_excludeCollRemainder(address _asset) external;

function movePendingVesselRewardsToActivePool(
address _asset,
Expand All @@ -219,11 +219,4 @@ interface IVesselManager is ITrinityBase {
) external;

function isVesselActive(address _asset, address _borrower) external view returns (bool);

function sendGasCompensation(
address _asset,
address _liquidator,
uint256 _debtTokenAmount,
uint256 _assetAmount
) external;
}
8 changes: 1 addition & 7 deletions contracts/Interfaces/IVesselManagerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@ interface IVesselManagerOperations is ITrinityBase {
event Liquidation(
address indexed _asset,
uint256 _liquidatedDebt,
uint256 _liquidatedColl,
uint256 _collGasCompensation,
uint256 _debtTokenGasCompensation
uint256 _liquidatedColl
);

event VesselLiquidated(
Expand Down Expand Up @@ -74,8 +72,6 @@ interface IVesselManagerOperations is ITrinityBase {
struct LiquidationTotals {
uint256 totalCollInSequence;
uint256 totalDebtInSequence;
uint256 totalCollGasCompensation;
uint256 totalDebtTokenGasCompensation;
uint256 totalDebtToOffset;
uint256 totalCollToSendToSP;
uint256 totalDebtToRedistribute;
Expand All @@ -86,8 +82,6 @@ interface IVesselManagerOperations is ITrinityBase {
struct LiquidationValues {
uint256 entireVesselDebt;
uint256 entireVesselColl;
uint256 collGasCompensation;
uint256 debtTokenGasCompensation;
uint256 debtToOffset;
uint256 collToSendToSP;
uint256 debtToRedistribute;
Expand Down
16 changes: 0 additions & 16 deletions contracts/TestContracts/VesselManagerTester.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,6 @@ contract VesselManagerTester is VesselManager {
return TrinityMath._computeCR(_coll, _debt, _price);
}

function getCollGasCompensation(address _asset, uint256 _coll) external view returns (uint256) {
return _getCollGasCompensation(_asset, _coll);
}

function getDebtTokenGasCompensation(address _asset) external view returns (uint256) {
return IAdminContract(adminContract).getDebtTokenGasCompensation(_asset);
}

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

function unprotectedDecayBaseRateFromBorrowing(address _asset) external returns (uint256) {
baseRate[_asset] = _calcDecayedBaseRate(_asset);
assert(baseRate[_asset] >= 0 && baseRate[_asset] <= DECIMAL_PRECISION);
Expand All @@ -47,10 +35,6 @@ contract VesselManagerTester is VesselManager {
return getRedemptionFee(_asset, _ETHDrawn);
}

function getActualDebtFromComposite(address _asset, uint256 _debtVal) external view returns (uint256) {
return _getNetDebt(_asset, _debtVal);
}

function callInternalRemoveVesselOwner(address _asset, address _vesselOwner) external {
uint256 vesselOwnersArrayLength = VesselOwners[_asset].length;
_removeVesselOwner(_asset, _vesselOwner, vesselOwnersArrayLength);
Expand Down
26 changes: 3 additions & 23 deletions contracts/VesselManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ contract VesselManager is IVesselManager, UUPSUpgradeable, ReentrancyGuardUpgrad
) external override nonReentrant onlyVesselManagerOperations {
_removeStake(_asset, _borrower);
_closeVessel(_asset, _borrower, Status.closedByRedemption);
_redeemCloseVessel(_asset, _borrower, IAdminContract(adminContract).getDebtTokenGasCompensation(_asset), _newColl);
_redeemCloseVessel(_asset, _borrower, _newColl);
emit VesselUpdated(_asset, _borrower, 0, 0, 0, VesselManagerOperation.redeemCollateral);
}

Expand Down Expand Up @@ -390,14 +390,13 @@ contract VesselManager is IVesselManager, UUPSUpgradeable, ReentrancyGuardUpgrad
}

function updateSystemSnapshots_excludeCollRemainder(
address _asset,
uint256 _collRemainder
address _asset
) external onlyVesselManagerOperations {
uint256 totalStakesCached = totalStakes[_asset];
totalStakesSnapshot[_asset] = totalStakesCached;
uint256 activeColl = IActivePool(activePool).getAssetBalance(_asset);
uint256 liquidatedColl = IDefaultPool(defaultPool).getAssetBalance(_asset);
uint256 _totalCollateralSnapshot = activeColl - _collRemainder + liquidatedColl;
uint256 _totalCollateralSnapshot = activeColl + liquidatedColl;
totalCollateralSnapshot[_asset] = _totalCollateralSnapshot;
emit SystemSnapshotsUpdated(_asset, totalStakesCached, _totalCollateralSnapshot);
}
Expand All @@ -414,32 +413,13 @@ contract VesselManager is IVesselManager, UUPSUpgradeable, ReentrancyGuardUpgrad
emit VesselUpdated(_asset, _borrower, 0, 0, 0, VesselManagerOperation.liquidateInNormalMode);
}

function sendGasCompensation(
address _asset,
address _liquidator,
uint256 _debtTokenAmount,
uint256 _assetAmount
) external nonReentrant onlyVesselManagerOperations {
if (_debtTokenAmount != 0) {
IDebtToken(debtToken).returnFromPool(gasPoolAddress, _liquidator, _debtTokenAmount);
}
if (_assetAmount != 0) {
IActivePool(activePool).sendAsset(_asset, _liquidator, _assetAmount);
}
}

// Internal functions ---------------------------------------------------------------------------------------------

function _redeemCloseVessel(
address _asset,
address _borrower,
uint256 _debtTokenAmount,
uint256 _assetAmount
) internal {
IDebtToken(debtToken).burn(gasPoolAddress, _debtTokenAmount);
// Update Active Pool, and send asset to account
IActivePool(activePool).decreaseDebt(_asset, _debtTokenAmount);
// send asset from Active Pool to CollSurplus Pool
ICollSurplusPool(collSurplusPool).accountSurplus(_asset, _borrower, _assetAmount);
IActivePool(activePool).sendAsset(_asset, collSurplusPool, _assetAmount);
}
Expand Down
Loading

0 comments on commit 76dbbdd

Please sign in to comment.