Skip to content

Commit

Permalink
fix: Switch CollSurplusPool to be address based again
Browse files Browse the repository at this point in the history
Before it was impossible to claim, as NFT wouldn’t exist, and
therefore we couldn’t check its owner.
  • Loading branch information
bingen committed May 3, 2024
1 parent 3fee998 commit 32c3766
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 26 deletions.
6 changes: 2 additions & 4 deletions contracts/src/BorrowerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -551,11 +551,9 @@ contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOpe
/**
* Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode
*/
function claimCollateral(uint256 _troveId) external override {
_requireIsOwner(_troveId);

function claimCollateral() external override {
// send ETH from CollSurplus Pool to owner
collSurplusPool.claimColl(msg.sender, _troveId);
collSurplusPool.claimColl(msg.sender);
}

// --- Helper functions ---
Expand Down
24 changes: 12 additions & 12 deletions contracts/src/CollSurplusPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ contract CollSurplusPool is Ownable, ICollSurplusPool {
// deposited ether tracker
uint256 internal ETHBalance;
// Collateral surplus claimable by trove owners
mapping(uint256 => uint256) internal balances;
mapping(address => uint256) internal balances;

// --- Events ---

event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
event TroveManagerAddressChanged(address _newTroveManagerAddress);
event ActivePoolAddressChanged(address _newActivePoolAddress);

event CollBalanceUpdated(uint256 indexed _troveId, uint256 _newBalance);
event CollBalanceUpdated(address indexed _account, uint256 _newBalance);
event EtherSent(address _to, uint256 _amount);

constructor(address _ETHAddress) {
Expand Down Expand Up @@ -59,29 +59,29 @@ contract CollSurplusPool is Ownable, ICollSurplusPool {
return ETHBalance;
}

function getCollateral(uint256 _troveId) external view override returns (uint256) {
return balances[_troveId];
function getCollateral(address _account) external view override returns (uint256) {
return balances[_account];
}

// --- Pool functionality ---

function accountSurplus(uint256 _troveId, uint256 _amount) external override {
function accountSurplus(address _account, uint256 _amount) external override {
_requireCallerIsTroveManager();

uint256 newAmount = balances[_troveId] + _amount;
balances[_troveId] = newAmount;
uint256 newAmount = balances[_account] + _amount;
balances[_account] = newAmount;
ETHBalance = ETHBalance + _amount;

emit CollBalanceUpdated(_troveId, newAmount);
emit CollBalanceUpdated(_account, newAmount);
}

function claimColl(address _account, uint256 _troveId) external override {
function claimColl(address _account) external override {
_requireCallerIsBorrowerOperations();
uint256 claimableColl = balances[_troveId];
uint256 claimableColl = balances[_account];
require(claimableColl > 0, "CollSurplusPool: No collateral available to claim");

balances[_troveId] = 0;
emit CollBalanceUpdated(_troveId, 0);
balances[_account] = 0;
emit CollBalanceUpdated(_account, 0);

ETHBalance = ETHBalance - claimableColl;
emit EtherSent(_account, claimableColl);
Expand Down
6 changes: 3 additions & 3 deletions contracts/src/Interfaces/IBorrowerOperations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ interface IBorrowerOperations is ILiquityBase {
) external;

function adjustUnredeemableTrove(
uint256 _troveId,
uint256 _troveId,
uint256 _maxFeePercentage,
uint256 _collChange,
bool _isCollIncrease,
Expand All @@ -65,8 +65,8 @@ interface IBorrowerOperations is ILiquityBase {
uint256 _upperHint,
uint256 _lowerHint
) external;
function claimCollateral(uint256 _troveId) external;

function claimCollateral() external;

function setAddManager(uint256 _troveId, address _manager) external;
function setRemoveManager(uint256 _troveId, address _manager) external;
Expand Down
6 changes: 3 additions & 3 deletions contracts/src/Interfaces/ICollSurplusPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ interface ICollSurplusPool {

function getETHBalance() external view returns (uint256);

function getCollateral(uint256 _troveId) external view returns (uint256);
function getCollateral(address _account) external view returns (uint256);

function accountSurplus(uint256 _troveId, uint256 _amount) external;
function accountSurplus(address _account, uint256 _amount) external;

function claimColl(address _account, uint256 _troveId) external;
function claimColl(address _account) external;
}
12 changes: 9 additions & 3 deletions contracts/src/TroveManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {
uint256 _boldInStabPool,
uint256 _price
) internal returns (LiquidationValues memory singleLiquidation) {
address owner = ownerOf(_troveId);

LocalVariables_InnerSingleLiquidateFunction memory vars;
(
singleLiquidation.entireTroveDebt,
Expand Down Expand Up @@ -369,7 +371,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {

// Differencen between liquidation penalty and liquidation threshold
if (singleLiquidation.collSurplus > 0) {
collSurplusPool.accountSurplus(_troveId, singleLiquidation.collSurplus);
collSurplusPool.accountSurplus(owner, singleLiquidation.collSurplus);
}

emit TroveLiquidated(
Expand Down Expand Up @@ -433,6 +435,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {

// If 100% < ICR < MCR, offset as much as possible, and redistribute the remainder
} else if ((_ICR > _100pct) && (_ICR < MCR)) {
address owner = ownerOf(_troveId);

_movePendingTroveRewardsToActivePool(
_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward
);
Expand All @@ -452,7 +456,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {

// Differencen between liquidation penalty and liquidation threshold
if (singleLiquidation.collSurplus > 0) {
collSurplusPool.accountSurplus(_troveId, singleLiquidation.collSurplus);
collSurplusPool.accountSurplus(owner, singleLiquidation.collSurplus);
}

emit TroveLiquidated(
Expand All @@ -469,6 +473,8 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {
* The remainder due to the capped rate will be claimable as collateral surplus.
*/
} else if ((_ICR >= MCR) && (_ICR < _TCR) && (singleLiquidation.entireTroveDebt <= _boldInStabPool)) {
address owner = ownerOf(_troveId);

_movePendingTroveRewardsToActivePool(
_activePool, _defaultPool, singleLiquidation.pendingDebtReward, vars.pendingCollReward
);
Expand All @@ -485,7 +491,7 @@ contract TroveManager is ERC721, LiquityBase, Ownable, ITroveManager {

_closeTrove(_troveId, Status.closedByLiquidation);
if (singleLiquidation.collSurplus > 0) {
collSurplusPool.accountSurplus(_troveId, singleLiquidation.collSurplus);
collSurplusPool.accountSurplus(owner, singleLiquidation.collSurplus);
}

emit TroveLiquidated(
Expand Down
2 changes: 1 addition & 1 deletion contracts/src/test/liquidations.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ contract LiquidationsTest is DevTestSetup {
"CollSurplusPoll should have received collateral"
);
vm.startPrank(A);
borrowerOperations.claimCollateral(ATroveId);
borrowerOperations.claimCollateral();
vm.stopPrank();
assertEq(WETH.balanceOf(A) - AInitialETHBalance, collSurplusAmount, "A collateral balance mismatch");
}
Expand Down

0 comments on commit 32c3766

Please sign in to comment.