From 0a2735cad259e271544bbdd2932df9a876f17107 Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sat, 26 Jun 2021 01:40:45 +0530 Subject: [PATCH] restructuring & updated function till repay --- .../mainnet/connectors/liquity/events.sol | 12 +- .../mainnet/connectors/liquity/helpers.sol | 33 +++- contracts/mainnet/connectors/liquity/main.sol | 146 +++++++++--------- 3 files changed, 113 insertions(+), 78 deletions(-) diff --git a/contracts/mainnet/connectors/liquity/events.sol b/contracts/mainnet/connectors/liquity/events.sol index 2457b8d3..8dc24320 100644 --- a/contracts/mainnet/connectors/liquity/events.sol +++ b/contracts/mainnet/connectors/liquity/events.sol @@ -8,14 +8,14 @@ contract Events { uint maxFeePercentage, uint depositAmount, uint borrowAmount, - uint getId, - uint setId + uint[] getIds, + uint[] setIds ); event LogClose(address indexed borrower, uint setId); - event LogDeposit(address indexed borrower, uint amount, uint getId); - event LogWithdraw(address indexed borrower, uint amount, uint setId); - event LogBorrow(address indexed borrower, uint amount, uint setId); - event LogRepay(address indexed borrower, uint amount, uint getId); + event LogDeposit(address indexed borrower, uint amount, uint getId, uint setId); + event LogWithdraw(address indexed borrower, uint amount, uint getId, uint setId); + event LogBorrow(address indexed borrower, uint amount, uint getId, uint setId); + event LogRepay(address indexed borrower, uint amount, uint getId, uint setId); event LogAdjust( address indexed borrower, uint maxFeePercentage, diff --git a/contracts/mainnet/connectors/liquity/helpers.sol b/contracts/mainnet/connectors/liquity/helpers.sol index 16048baf..0fc9ef1c 100644 --- a/contracts/mainnet/connectors/liquity/helpers.sol +++ b/contracts/mainnet/connectors/liquity/helpers.sol @@ -3,4 +3,35 @@ pragma solidity ^0.7.6; import { DSMath } from "../../common/math.sol"; import { Basic } from "../../common/basic.sol"; -abstract contract Helpers is DSMath, Basic {} +import { TokenInterface } from "../../common/interfaces.sol"; + +import { + BorrowerOperationsLike, + TroveManagerLike, + StabilityPoolLike, + StakingLike, + CollateralSurplusLike, + LqtyTokenLike +} from "./interface.sol"; + +abstract contract Helpers is DSMath, Basic { + + BorrowerOperationsLike internal constant borrowerOperations = BorrowerOperationsLike(0x24179CD81c9e782A4096035f7eC97fB8B783e007); + TroveManagerLike internal constant troveManager = TroveManagerLike(0xA39739EF8b0231DbFA0DcdA07d7e29faAbCf4bb2); + StabilityPoolLike internal constant stabilityPool = StabilityPoolLike(0x66017D22b0f8556afDd19FC67041899Eb65a21bb); + StakingLike internal constant staking = StakingLike(0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d); + CollateralSurplusLike internal constant collateralSurplus = CollateralSurplusLike(0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521); + LqtyTokenLike internal constant lqtyToken = LqtyTokenLike(0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D); + TokenInterface internal constant lusdToken = TokenInterface(0x5f98805A4E8be255a32880FDeC7F6728C6568bA0); + + // Prevents stack-too-deep error + struct AdjustTrove { + uint maxFeePercentage; + uint withdrawAmount; + uint depositAmount; + uint borrowAmount; + uint repayAmount; + bool isBorrow; + } + +} diff --git a/contracts/mainnet/connectors/liquity/main.sol b/contracts/mainnet/connectors/liquity/main.sol index 4e42c216..643994fa 100644 --- a/contracts/mainnet/connectors/liquity/main.sol +++ b/contracts/mainnet/connectors/liquity/main.sol @@ -17,28 +17,7 @@ import { Helpers } from "./helpers.sol"; import { Events } from "./events.sol"; abstract contract LiquityResolver is Events, Helpers { - BorrowerOperationsLike internal constant borrowerOperations = - BorrowerOperationsLike(0x24179CD81c9e782A4096035f7eC97fB8B783e007); - TroveManagerLike internal constant troveManager = - TroveManagerLike(0xA39739EF8b0231DbFA0DcdA07d7e29faAbCf4bb2); - StabilityPoolLike internal constant stabilityPool = - StabilityPoolLike(0x66017D22b0f8556afDd19FC67041899Eb65a21bb); - StakingLike internal constant staking = - StakingLike(0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d); - CollateralSurplusLike internal constant collateralSurplus = - CollateralSurplusLike(0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521); - LqtyTokenLike internal constant lqtyToken = - LqtyTokenLike(0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D); - - // Prevents stack-too-deep error - struct AdjustTrove { - uint maxFeePercentage; - uint withdrawAmount; - uint depositAmount; - uint borrowAmount; - uint repayAmount; - bool isBorrow; - } + /* Begin: Trove */ @@ -50,8 +29,8 @@ abstract contract LiquityResolver is Events, Helpers { * @param borrowAmount The amount of LUSD to borrow * @param upperHint Address of the Trove near the upper bound of where the user's Trove should now sit in the ordered Trove list * @param lowerHint Address of the Trove near the lower bound of where the user's Trove should now sit in the ordered Trove list - * @param getId Optional storage slot to retrieve ETH from - * @param setId Optional storage slot to store the LUSD borrowed against + * @param getIds Optional (default: 0) Optional storage slot to get deposit & borrow amounts stored using other spells + * @param setIds Optional (default: 0) Optional storage slot to set deposit & borrow amounts to be used in future spells */ function open( uint depositAmount, @@ -59,26 +38,27 @@ abstract contract LiquityResolver is Events, Helpers { uint borrowAmount, address upperHint, address lowerHint, - uint getId, - uint setId + uint[] getIds, + uint[] setIds ) external payable returns (string memory _eventName, bytes memory _eventParam) { - if (getId != 0 && depositAmount != 0) { - revert("open(): Cannot supply a depositAmount if a non-zero getId is supplied"); - } - depositAmount = getUint(getId, depositAmount); + uint _depositAmount = getUint(getIds[0], depositAmount); + uint _borrowAmount = getUint(getIds[1], borrowAmount); - borrowerOperations.openTrove{value: depositAmount}( + _depositAmount = _depositAmount == uint(-1) ? address(this).balance : _depositAmount; + + borrowerOperations.openTrove{value: _depositAmount}( maxFeePercentage, - borrowAmount, + _borrowAmount, upperHint, lowerHint ); - // Allow other spells to use the borrowed amount - setUint(setId, borrowAmount); - _eventName = "LogOpen(address,uint256,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, maxFeePercentage, depositAmount, borrowAmount, getId, setId); + setUint(setIds[0], _depositAmount); + setUint(setIds[1], _borrowAmount); + + _eventName = "LogOpen(address,uint256,uint256,uint256,uint256[],uint256[])"; + _eventParam = abi.encode(address(this), maxFeePercentage, _depositAmount, _borrowAmount, getIds, setIds); } /** @@ -86,14 +66,14 @@ abstract contract LiquityResolver is Events, Helpers { * @notice Closes a Trove by repaying LUSD debt * @param setId Optional storage slot to store the ETH withdrawn from the Trove */ - function close(uint setId) external returns (string memory _eventName, bytes memory _eventParam) { + function close(uint setId) external payable returns (string memory _eventName, bytes memory _eventParam) { uint collateral = troveManager.getTroveColl(address(this)); borrowerOperations.closeTrove(); // Allow other spells to use the collateral released from the Trove setUint(setId, collateral); _eventName = "LogClose(address,uint256)"; - _eventParam = abi.encode(msg.sender, setId); + _eventParam = abi.encode(address(this), setId); } /** @@ -103,20 +83,26 @@ abstract contract LiquityResolver is Events, Helpers { * @param upperHint Address of the Trove near the upper bound of where the user's Trove should now sit in the ordered Trove list * @param lowerHint Address of the Trove near the lower bound of where the user's Trove should now sit in the ordered Trove list * @param getId Optional storage slot to retrieve the ETH from + * @param setId Optional storage slot to set the ETH deposited */ function deposit( uint amount, address upperHint, address lowerHint, - uint getId + uint getId, + uint setId ) external payable returns (string memory _eventName, bytes memory _eventParam) { - if (getId != 0 && amount != 0) { - revert("deposit(): Cannot supply an amount if a non-zero getId is supplied"); - } - amount = getUint(getId, amount); - borrowerOperations.addColl{value: amount}(upperHint, lowerHint); - _eventName = "LogDeposit(address,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, getId); + + uint _amount = getUint(getId, amount); + + _amount = _amount == uint(-1) ? address(this).balance : _amount; + + borrowerOperations.addColl{value: _amount}(upperHint, lowerHint); + + setUint(setId, _amount); + + _eventName = "LogDeposit(address,uint256,uint256,uint256)"; + _eventParam = abi.encode(address(this), _amount, getId, setId); } /** @@ -125,19 +111,25 @@ abstract contract LiquityResolver is Events, Helpers { * @param amount Amount of ETH to move from Trove to DSA * @param upperHint Address of the Trove near the upper bound of where the user's Trove should now sit in the ordered Trove list * @param lowerHint Address of the Trove near the lower bound of where the user's Trove should now sit in the ordered Trove list + * @param getId Optional storage slot to get the amount of ETH to withdraw * @param setId Optional storage slot to store the withdrawn ETH in */ function withdraw( uint amount, address upperHint, address lowerHint, + uint getId, uint setId ) external payable returns (string memory _eventName, bytes memory _eventParam) { - borrowerOperations.withdrawColl(amount, upperHint, lowerHint); + uint _amount = getUint(getId, amount); - setUint(setId, amount); - _eventName = "LogWithdraw(address,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, setId); + _amount = _amount == uint(-1) ? troveManager.getTroveColl(address(this)) : _amount; + + borrowerOperations.withdrawColl(_amount, upperHint, lowerHint); + + setUint(setId, _amount); + _eventName = "LogWithdraw(address,uint256,uint256,uint256)"; + _eventParam = abi.encode(address(this), _amount, getId, setId); } /** @@ -154,13 +146,17 @@ abstract contract LiquityResolver is Events, Helpers { uint amount, address upperHint, address lowerHint, + uint getId, uint setId ) external payable returns (string memory _eventName, bytes memory _eventParam) { - borrowerOperations.withdrawLUSD(maxFeePercentage, amount, upperHint, lowerHint); + uint _amount = getUint(getId, amount); - setUint(setId, amount); - _eventName = "LogBorrow(address,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, setId); + borrowerOperations.withdrawLUSD(maxFeePercentage, _amount, upperHint, lowerHint); + + setUint(setId, _amount); + + _eventName = "LogBorrow(address,uint256,uint256,uint256)"; + _eventParam = abi.encode(address(this), _amount, getId, setId); } /** @@ -175,15 +171,23 @@ abstract contract LiquityResolver is Events, Helpers { uint amount, address upperHint, address lowerHint, - uint getId + uint getId, + uint setId ) external payable returns (string memory _eventName, bytes memory _eventParam) { - if (getId != 0 && amount != 0) { - revert("repay(): Cannot supply an amount if a non-zero getId is supplied"); + uint _amount = getUint(getId, amount); + + if (_amount == uint(-1)) { + uint _lusdBal = lusdToken.balanceOf(address(this)); + uint _totalDebt = troveManager.getTroveDebt(address(this)); + _amount = _lusdBal > _totalDebt ? _totalDebt : _lusdBal; } - amount = getUint(getId, amount); - borrowerOperations.repayLUSD(amount, upperHint, lowerHint); - _eventName = "LogRepay(address,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, getId); + + borrowerOperations.repayLUSD(_amount, upperHint, lowerHint); + + setUint(setId, _amount); + + _eventName = "LogRepay(address,uint256,uint256,uint256)"; + _eventParam = abi.encode(address(this), _amount, getId, setId); } /** @@ -245,7 +249,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setBorrowId, borrowAmount); _eventName = "LogAdjust(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, maxFeePercentage, depositAmount, withdrawAmount, borrowAmount, repayAmount, getDepositId, setWithdrawId, getRepayId, setBorrowId); + _eventParam = abi.encode(address(this), maxFeePercentage, depositAmount, withdrawAmount, borrowAmount, repayAmount, getDepositId, setWithdrawId, getRepayId, setBorrowId); } /** @@ -253,13 +257,13 @@ abstract contract LiquityResolver is Events, Helpers { * @param setId Optional storage slot to store the ETH claimed * @notice Claim remaining collateral from Trove */ - function claimCollateralFromRedemption(uint setId) external returns(string memory _eventName, bytes memory _eventParam) { + function claimCollateralFromRedemption(uint setId) external payable returns(string memory _eventName, bytes memory _eventParam) { uint amount = collateralSurplus.getCollateral(address(this)); borrowerOperations.claimCollateral(); setUint(setId, amount); _eventName = "LogClaimCollateralFromRedemption(address,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, setId); + _eventParam = abi.encode(address(this), amount, setId); } /* End: Trove */ @@ -280,7 +284,7 @@ abstract contract LiquityResolver is Events, Helpers { uint getDepositId, uint setEthGainId, uint setLqtyGainId - ) external returns (string memory _eventName, bytes memory _eventParam) { + ) external payable returns (string memory _eventName, bytes memory _eventParam) { amount = getUint(getDepositId, amount); uint ethGain = stabilityPool.getDepositorETHGain(address(this)); @@ -295,7 +299,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setLqtyGainId, lqtyGain); _eventName = "LogStabilityDeposit(address,uint256,uint256,uint256,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, ethGain, lqtyGain, frontendTag, getDepositId, setEthGainId, setLqtyGainId); + _eventParam = abi.encode(address(this), amount, ethGain, lqtyGain, frontendTag, getDepositId, setEthGainId, setLqtyGainId); } /** @@ -325,7 +329,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setLqtyGainId, lqtyGain); _eventName = "LogStabilityWithdraw(address,uint256,uint256,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, ethGain, lqtyGain, setWithdrawId, setEthGainId, setLqtyGainId); + _eventParam = abi.encode(address(this), amount, ethGain, lqtyGain, setWithdrawId, setEthGainId, setLqtyGainId); } /** @@ -341,7 +345,7 @@ abstract contract LiquityResolver is Events, Helpers { uint amount = stabilityPool.getDepositorETHGain(address(this)); stabilityPool.withdrawETHGainToTrove(upperHint, lowerHint); _eventName = "LogStabilityMoveEthGainToTrove(address,uint256)"; - _eventParam = abi.encode(msg.sender, amount); + _eventParam = abi.encode(address(this), amount); } /* End: Stability Pool */ @@ -370,7 +374,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setLusdGainId, lusdGain); _eventName = "LogStake(address,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, getStakeId, setEthGainId, setLusdGainId); + _eventParam = abi.encode(address(this), amount, getStakeId, setEthGainId, setLusdGainId); } /** @@ -396,7 +400,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setLusdGainId, lusdGain); _eventName = "LogUnstake(address,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, amount, setStakeId, setEthGainId, setLusdGainId); + _eventParam = abi.encode(address(this), amount, setStakeId, setEthGainId, setLusdGainId); } /** @@ -418,7 +422,7 @@ abstract contract LiquityResolver is Events, Helpers { setUint(setLusdGainId, lusdGain); _eventName = "LogClaimStakingGains(address,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(msg.sender, ethGain, lusdGain, setEthGainId, setLusdGainId); + _eventParam = abi.encode(address(this), ethGain, lusdGain, setEthGainId, setLusdGainId); } /* End: Staking */