mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	log the eth and lqty gains from stability pool operations. general tidy up
This commit is contained in:
		
							parent
							
								
									7588733d98
								
							
						
					
					
						commit
						4ea58ba50d
					
				|  | @ -34,6 +34,8 @@ contract Events { | |||
|     event LogStabilityDeposit( | ||||
|         address indexed borrower, | ||||
|         uint amount, | ||||
|         uint ethGain, | ||||
|         uint lqtyGain, | ||||
|         address frontendTag, | ||||
|         uint getDepositId, | ||||
|         uint setEthGainId, | ||||
|  | @ -41,6 +43,8 @@ contract Events { | |||
|     ); | ||||
|     event LogStabilityWithdraw(address indexed borrower, | ||||
|         uint amount, | ||||
|         uint ethGain, | ||||
|         uint lqtyGain, | ||||
|         uint setWithdrawId, | ||||
|         uint setEthGainId, | ||||
|         uint setLqtyGainId | ||||
|  |  | |||
|  | @ -66,3 +66,7 @@ interface StakingLike { | |||
| interface CollateralSurplusLike {  | ||||
|     function getCollateral(address _account) external view returns (uint); | ||||
| } | ||||
| 
 | ||||
| interface LqtyTokenLike { | ||||
|     function balanceOf(address account) external view returns (uint256); | ||||
| } | ||||
|  |  | |||
|  | @ -9,7 +9,8 @@ import { | |||
|     TroveManagerLike, | ||||
|     StabilityPoolLike, | ||||
|     StakingLike, | ||||
|     CollateralSurplusLike | ||||
|     CollateralSurplusLike, | ||||
|     LqtyTokenLike | ||||
| } from "./interface.sol"; | ||||
| import { Stores } from "../../common/stores.sol"; | ||||
| import { Helpers } from "./helpers.sol"; | ||||
|  | @ -26,6 +27,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|         StakingLike(0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d); | ||||
|     CollateralSurplusLike internal constant collateralSurplus = | ||||
|         CollateralSurplusLike(0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521); | ||||
|     LqtyTokenLike internal constant lqtyToken = | ||||
|         LqtyTokenLike(0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D); | ||||
|      | ||||
|     // Prevents stack-too-deep error | ||||
|     struct AdjustTrove { | ||||
|  | @ -45,8 +48,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @param depositAmount The amount of ETH to deposit | ||||
|      * @param maxFeePercentage The maximum borrow fee that this transaction should permit  | ||||
|      * @param borrowAmount The amount of LUSD to borrow | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 | ||||
|     */ | ||||
|  | @ -97,8 +100,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @dev Deposit ETH to Trove | ||||
|      * @notice Increase Trove collateral (collateral Top up) | ||||
|      * @param amount Amount of ETH to deposit into Trove | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 | ||||
|     */ | ||||
|     function deposit( | ||||
|  | @ -120,8 +123,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @dev Withdraw ETH from Trove | ||||
|      * @notice Move Trove collateral from Trove to DSA | ||||
|      * @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 will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 setId Optional storage slot to store the withdrawn ETH in | ||||
|     */ | ||||
|    function withdraw( | ||||
|  | @ -142,8 +145,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @notice Borrow LUSD via an existing Trove | ||||
|      * @param maxFeePercentage The maximum borrow fee that this transaction should permit  | ||||
|      * @param amount Amount of LUSD to borrow | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 setId Optional storage slot to store the borrowed LUSD in | ||||
|     */ | ||||
|     function borrow( | ||||
|  | @ -155,7 +158,7 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|     ) external payable returns (string memory _eventName, bytes memory _eventParam)  { | ||||
|         borrowerOperations.withdrawLUSD(maxFeePercentage, amount, upperHint, lowerHint); | ||||
| 
 | ||||
|         setUint(setId, amount); // TODO: apply fee / get exact amount borrowed (with the fee applied) | ||||
|         setUint(setId, amount); | ||||
|         _eventName = "LogBorrow(address,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(msg.sender, amount, setId); | ||||
|     } | ||||
|  | @ -164,8 +167,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @dev Send LUSD to repay debt | ||||
|      * @notice Repay LUSD Trove debt | ||||
|      * @param amount Amount of LUSD to repay | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 LUSD from | ||||
|     */ | ||||
|     function repay( | ||||
|  | @ -191,8 +194,8 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @param depositAmount Amount of ETH to deposit | ||||
|      * @param borrowAmount Amount of LUSD to borrow | ||||
|      * @param repayAmount Amount of LUSD to repay | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 getDepositId Optional storage slot to retrieve the ETH to deposit | ||||
|      * @param setWithdrawId Optional storage slot to store the withdrawn ETH to | ||||
|      * @param getRepayId Optional storage slot to retrieve the LUSD to repay | ||||
|  | @ -269,7 +272,7 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @param frontendTag Address of the frontend to make this deposit against (determines the kickback rate of rewards) | ||||
|      * @param getDepositId Optional storage slot to retrieve the LUSD from | ||||
|      * @param setEthGainId Optional storage slot to store any ETH gains in | ||||
|      * @param setLqtyGainId Optional storage slot to store any ETH gains in | ||||
|      * @param setLqtyGainId Optional storage slot to store any LQTY gains in | ||||
|     */ | ||||
|     function stabilityDeposit( | ||||
|         uint amount, | ||||
|  | @ -281,14 +284,18 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|         amount = getUint(getDepositId, amount); | ||||
| 
 | ||||
|         uint ethGain = stabilityPool.getDepositorETHGain(address(this)); | ||||
|         uint lqtyGain = stabilityPool.getDepositorLQTYGain(address(this)); | ||||
|         uint lqtyBalanceBefore = lqtyToken.balanceOf(address(this)); | ||||
|          | ||||
|         stabilityPool.provideToSP(amount, frontendTag); | ||||
|          | ||||
|         uint lqtyBalanceAfter = lqtyToken.balanceOf(address(this)); | ||||
|         uint lqtyGain = sub(lqtyBalanceAfter, lqtyBalanceBefore); | ||||
| 
 | ||||
|         setUint(setEthGainId, ethGain); | ||||
|         setUint(setLqtyGainId, lqtyGain); | ||||
| 
 | ||||
|         _eventName = "LogStabilityDeposit(address,uint256,address,uint256,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(msg.sender, amount, frontendTag, getDepositId, setEthGainId, setLqtyGainId); | ||||
|         _eventName = "LogStabilityDeposit(address,uint256,uint256,uint256,address,uint256,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(msg.sender, amount, ethGain, lqtyGain, frontendTag, getDepositId, setEthGainId, setLqtyGainId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -297,7 +304,7 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|      * @param amount Amount of LUSD to withdraw from Stability Pool | ||||
|      * @param setWithdrawId Optional storage slot to store the withdrawn LUSD | ||||
|      * @param setEthGainId Optional storage slot to store any ETH gains in | ||||
|      * @param setLqtyGainId Optional storage slot to store any ETH gains in | ||||
|      * @param setLqtyGainId Optional storage slot to store any LQTY gains in | ||||
|     */ | ||||
|     function stabilityWithdraw( | ||||
|         uint amount, | ||||
|  | @ -305,23 +312,27 @@ abstract contract LiquityResolver is Events, Helpers { | |||
|         uint setEthGainId, | ||||
|         uint setLqtyGainId | ||||
|     ) external returns (string memory _eventName, bytes memory _eventParam) { | ||||
|         stabilityPool.withdrawFromSP(amount); | ||||
|         uint ethGain = stabilityPool.getDepositorETHGain(address(this)); | ||||
|         uint lqtyGain = stabilityPool.getDepositorLQTYGain(address(this)); | ||||
|         uint lqtyBalanceBefore = lqtyToken.balanceOf(address(this)); | ||||
|          | ||||
|         stabilityPool.withdrawFromSP(amount); | ||||
|          | ||||
|         uint lqtyBalanceAfter = lqtyToken.balanceOf(address(this)); | ||||
|         uint lqtyGain = sub(lqtyBalanceAfter, lqtyBalanceBefore); | ||||
| 
 | ||||
|         setUint(setWithdrawId, amount); | ||||
|         setUint(setEthGainId, ethGain); | ||||
|         setUint(setLqtyGainId, lqtyGain); | ||||
| 
 | ||||
|         _eventName = "LogStabilityWithdraw(address,uint256,uint256,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(msg.sender, amount, setWithdrawId, setEthGainId, setLqtyGainId); | ||||
|         _eventName = "LogStabilityWithdraw(address,uint256,uint256,uint256,uint256,uint256,uint256)"; | ||||
|         _eventParam = abi.encode(msg.sender, amount, ethGain, lqtyGain, setWithdrawId, setEthGainId, setLqtyGainId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * @dev Increase Trove collateral by sending Stability Pool ETH gain to user's Trove | ||||
|      * @notice Moves user's ETH gain from the Stability Pool into their Trove | ||||
|      * @param upperHint Address of the Trove near the upper bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @param lowerHint Address of the Trove near the lower bound of where the user's Trove will now sit in the ordered Trove list | ||||
|      * @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 | ||||
|     */ | ||||
|     function stabilityMoveEthGainToTrove( | ||||
|         address upperHint, | ||||
|  |  | |||
|  | @ -46,6 +46,7 @@ const STABILITY_POOL_ADDRESS = "0x66017D22b0f8556afDd19FC67041899Eb65a21bb"; | |||
| const STABILITY_POOL_ABI = [ | ||||
|   "function getCompoundedLUSDDeposit(address _depositor) external view returns (uint)", | ||||
|   "function getDepositorETHGain(address _depositor) external view returns (uint)", | ||||
|   "function getDepositorLQTYGain(address _depositor) external view returns (uint)", | ||||
| ]; | ||||
| 
 | ||||
| const STAKING_ADDRESS = "0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d"; | ||||
|  |  | |||
|  | @ -121,7 +121,6 @@ const resetHardhatBlockNumber = async (blockNumber) => { | |||
| const deployAndConnect = async (contracts, isDebug = false) => { | ||||
|   // Pin Liquity tests to a particular block number to create deterministic state (Ether price etc.)
 | ||||
|   await resetHardhatBlockNumber(LIQUIDATABLE_TROVES_BLOCK_NUMBER); | ||||
| 
 | ||||
|   const liquity = { | ||||
|     troveManager: null, | ||||
|     borrowerOperations: null, | ||||
|  | @ -163,93 +162,65 @@ const deployAndConnect = async (contracts, isDebug = false) => { | |||
|     contracts.TROVE_MANAGER_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("TroveManager contract address", liquity.troveManager.address); | ||||
| 
 | ||||
|   liquity.borrowerOperations = new ethers.Contract( | ||||
|     contracts.BORROWER_OPERATIONS_ADDRESS, | ||||
|     contracts.BORROWER_OPERATIONS_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log( | ||||
|       "BorrowerOperations contract address", | ||||
|       liquity.borrowerOperations.address | ||||
|     ); | ||||
| 
 | ||||
|   liquity.stabilityPool = new ethers.Contract( | ||||
|     contracts.STABILITY_POOL_ADDRESS, | ||||
|     contracts.STABILITY_POOL_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log( | ||||
|       "StabilityPool contract address", | ||||
|       liquity.stabilityPool.address | ||||
|     ); | ||||
| 
 | ||||
|   liquity.lusdToken = new ethers.Contract( | ||||
|     contracts.LUSD_TOKEN_ADDRESS, | ||||
|     contracts.LUSD_TOKEN_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("LusdToken contract address", liquity.lusdToken.address); | ||||
| 
 | ||||
|   liquity.lqtyToken = new ethers.Contract( | ||||
|     contracts.LQTY_TOKEN_ADDRESS, | ||||
|     contracts.LQTY_TOKEN_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("LqtyToken contract address", liquity.lqtyToken.address); | ||||
| 
 | ||||
|   liquity.activePool = new ethers.Contract( | ||||
|     contracts.ACTIVE_POOL_ADDRESS, | ||||
|     contracts.ACTIVE_POOL_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("ActivePool contract address", liquity.activePool.address); | ||||
| 
 | ||||
|   liquity.priceFeed = new ethers.Contract( | ||||
|     contracts.PRICE_FEED_ADDRESS, | ||||
|     contracts.PRICE_FEED_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("PriceFeed contract address", liquity.priceFeed.address); | ||||
| 
 | ||||
|   liquity.hintHelpers = new ethers.Contract( | ||||
|     contracts.HINT_HELPERS_ADDRESS, | ||||
|     contracts.HINT_HELPERS_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("HintHelpers contract address", liquity.hintHelpers.address); | ||||
| 
 | ||||
|   liquity.sortedTroves = new ethers.Contract( | ||||
|     contracts.SORTED_TROVES_ADDRESS, | ||||
|     contracts.SORTED_TROVES_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("SortedTroves contract address", liquity.sortedTroves.address); | ||||
| 
 | ||||
|   liquity.staking = new ethers.Contract( | ||||
|     contracts.STAKING_ADDRESS, | ||||
|     contracts.STAKING_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && console.log("Staking contract address", liquity.staking.address); | ||||
| 
 | ||||
|   liquity.collSurplus = new ethers.Contract( | ||||
|     contracts.COLL_SURPLUS_ADDRESS, | ||||
|     contracts.COLL_SURPLUS_ABI, | ||||
|     ethers.provider | ||||
|   ); | ||||
|   isDebug && | ||||
|     console.log("CollSurplus contract address", liquity.collSurplus.address); | ||||
| 
 | ||||
|   return liquity; | ||||
| }; | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ const contracts = require("./liquity.contracts"); | |||
| // Liquity helpers
 | ||||
| const helpers = require("./liquity.helpers"); | ||||
| 
 | ||||
| describe.only("Liquity", () => { | ||||
| describe("Liquity", () => { | ||||
|   const { waffle, ethers } = hre; | ||||
|   const { provider } = waffle; | ||||
| 
 | ||||
|  | @ -1732,6 +1732,7 @@ describe.only("Liquity", () => { | |||
| 
 | ||||
|         it("returns Instadapp event name and data", async () => { | ||||
|           const amount = ethers.utils.parseUnits("100", 18); | ||||
|           const halfAmount = amount.div(2); | ||||
|           const frontendTag = ethers.constants.AddressZero; | ||||
|           const getDepositId = 0; | ||||
|           const setEthGainId = 0; | ||||
|  | @ -1747,21 +1748,67 @@ describe.only("Liquity", () => { | |||
|           const stabilityDepositSpell = { | ||||
|             connector: helpers.LIQUITY_CONNECTOR, | ||||
|             method: "stabilityDeposit", | ||||
|             args: [amount, frontendTag, getDepositId, 0, 0], | ||||
|             args: [halfAmount, frontendTag, getDepositId, 0, 0], | ||||
|           }; | ||||
| 
 | ||||
|           const depositTx = await dsa | ||||
|           // Create a Stability deposit for this DSA
 | ||||
|           await dsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells([stabilityDepositSpell]), userWallet.address); | ||||
| 
 | ||||
|           const receipt = await depositTx.wait(); | ||||
|           // Liquidate a Trove to cause an ETH gain
 | ||||
|           await liquity.troveManager.connect(userWallet).liquidateTroves(1, { | ||||
|             gasLimit: helpers.MAX_GAS, | ||||
|           }); | ||||
| 
 | ||||
|           // Fast forward in time so we have an LQTY gain
 | ||||
|           await provider.send("evm_increaseTime", [600]); | ||||
|           await provider.send("evm_mine"); | ||||
| 
 | ||||
|           // Create a Stability Pool deposit with a differen DSA so that LQTY gains can be calculated
 | ||||
|           // See: https://github.com/liquity/dev/#lqty-reward-events-and-payouts
 | ||||
|           const tempDsa = await buildDSAv2(userWallet.address); | ||||
|           await helpers.sendToken( | ||||
|             liquity.lusdToken, | ||||
|             amount, | ||||
|             contracts.STABILITY_POOL_ADDRESS, | ||||
|             tempDsa.address | ||||
|           ); | ||||
|           await tempDsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells([stabilityDepositSpell]), userWallet.address); | ||||
| 
 | ||||
|           const ethGain = await liquity.stabilityPool.getDepositorETHGain( | ||||
|             dsa.address | ||||
|           ); | ||||
|           const lqtyGain = await liquity.stabilityPool.getDepositorLQTYGain( | ||||
|             dsa.address | ||||
|           ); | ||||
| 
 | ||||
|           // Top up the user's deposit so that we can track their ETH and LQTY gain
 | ||||
|           const depositAgainTx = await dsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells([stabilityDepositSpell]), userWallet.address); | ||||
| 
 | ||||
|           const receipt = await depositAgainTx.wait(); | ||||
|           const castLogEvent = receipt.events.find((e) => e.event === "LogCast") | ||||
|             .args; | ||||
|           const expectedEventParams = ethers.utils.defaultAbiCoder.encode( | ||||
|             ["address", "uint256", "address", "uint256", "uint256", "uint256"], | ||||
|             [ | ||||
|               "address", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "address", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|             ], | ||||
|             [ | ||||
|               userWallet.address, | ||||
|               amount, | ||||
|               halfAmount, | ||||
|               ethGain, | ||||
|               lqtyGain, | ||||
|               frontendTag, | ||||
|               getDepositId, | ||||
|               setEthGainId, | ||||
|  | @ -1769,7 +1816,7 @@ describe.only("Liquity", () => { | |||
|             ] | ||||
|           ); | ||||
|           expect(castLogEvent.eventNames[0]).eq( | ||||
|             "LogStabilityDeposit(address,uint256,address,uint256,uint256,uint256)" | ||||
|             "LogStabilityDeposit(address,uint256,uint256,uint256,address,uint256,uint256,uint256)" | ||||
|           ); | ||||
|           expect(castLogEvent.eventParams[0]).eq(expectedEventParams); | ||||
|         }); | ||||
|  | @ -1777,7 +1824,7 @@ describe.only("Liquity", () => { | |||
| 
 | ||||
|       describe("stabilityWithdraw()", () => { | ||||
|         it("withdraws from Stability Pool", async () => { | ||||
|           // Start this test from scratch since we don't want to rely on test order for this to pass.
 | ||||
|           // Start this test from scratch since we need to remove any liquidatable Troves withdrawing from Stability Pool
 | ||||
|           [liquity, dsa] = await helpers.resetInitialState( | ||||
|             userWallet.address, | ||||
|             contracts | ||||
|  | @ -1788,6 +1835,7 @@ describe.only("Liquity", () => { | |||
|           await liquity.troveManager.connect(userWallet).liquidateTroves(90, { | ||||
|             gasLimit: helpers.MAX_GAS, | ||||
|           }); | ||||
| 
 | ||||
|           const amount = ethers.utils.parseUnits("100", 18); | ||||
|           const frontendTag = ethers.constants.AddressZero; | ||||
| 
 | ||||
|  | @ -1805,12 +1853,12 @@ describe.only("Liquity", () => { | |||
|           }; | ||||
| 
 | ||||
|           // Withdraw half of the deposit
 | ||||
|           const stabilitWithdrawSpell = { | ||||
|           const stabilityWithdrawSpell = { | ||||
|             connector: helpers.LIQUITY_CONNECTOR, | ||||
|             method: "stabilityWithdraw", | ||||
|             args: [amount.div(2), 0, 0, 0], | ||||
|           }; | ||||
|           const spells = [stabilityDepositSpell, stabilitWithdrawSpell]; | ||||
|           const spells = [stabilityDepositSpell, stabilityWithdrawSpell]; | ||||
| 
 | ||||
|           await dsa | ||||
|             .connect(userWallet) | ||||
|  | @ -1826,7 +1874,7 @@ describe.only("Liquity", () => { | |||
|         }); | ||||
| 
 | ||||
|         it("withdraws from Stability Pool and stores the LUSD for other spells", async () => { | ||||
|           // Start this test from scratch since we don't want to rely on test order for this to pass.
 | ||||
|           // Start this test from scratch since we need to remove any liquidatable Troves withdrawing from Stability Pool
 | ||||
|           [liquity, dsa] = await helpers.resetInitialState( | ||||
|             userWallet.address, | ||||
|             contracts | ||||
|  | @ -1855,7 +1903,7 @@ describe.only("Liquity", () => { | |||
|           }; | ||||
| 
 | ||||
|           // Withdraw half of the deposit
 | ||||
|           const stabilitWithdrawSpell = { | ||||
|           const stabilityWithdrawSpell = { | ||||
|             connector: helpers.LIQUITY_CONNECTOR, | ||||
|             method: "stabilityWithdraw", | ||||
|             args: [amount.div(2), 0, 0, withdrawId], | ||||
|  | @ -1875,7 +1923,7 @@ describe.only("Liquity", () => { | |||
| 
 | ||||
|           const spells = [ | ||||
|             stabilityDepositSpell, | ||||
|             stabilitWithdrawSpell, | ||||
|             stabilityWithdrawSpell, | ||||
|             withdrawLusdSpell, | ||||
|           ]; | ||||
| 
 | ||||
|  | @ -1895,17 +1943,12 @@ describe.only("Liquity", () => { | |||
|         }); | ||||
| 
 | ||||
|         it("returns Instadapp event name and data", async () => { | ||||
|           // Start this test from scratch since we don't want to rely on test order for this to pass.
 | ||||
|           // Start this test from scratch since we need to remove any liquidatable Troves withdrawing from Stability Pool
 | ||||
|           [liquity, dsa] = await helpers.resetInitialState( | ||||
|             userWallet.address, | ||||
|             contracts | ||||
|           ); | ||||
| 
 | ||||
|           // The current block number has liquidatable Troves.
 | ||||
|           // Remove them otherwise Stability Pool withdrawals are disabled
 | ||||
|           await liquity.troveManager.connect(userWallet).liquidateTroves(90, { | ||||
|             gasLimit: helpers.MAX_GAS, | ||||
|           }); | ||||
|           const amount = ethers.utils.parseUnits("100", 18); | ||||
|           const frontendTag = ethers.constants.AddressZero; | ||||
| 
 | ||||
|  | @ -1928,34 +1971,81 @@ describe.only("Liquity", () => { | |||
|           const setEthGainId = 0; | ||||
|           const setLqtyGainId = 0; | ||||
| 
 | ||||
|           const stabilitWithdrawSpell = { | ||||
|           // Create a Stability Pool deposit
 | ||||
|           await dsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells([stabilityDepositSpell]), userWallet.address); | ||||
| 
 | ||||
|           // The current block number has liquidatable Troves.
 | ||||
|           // Remove them otherwise Stability Pool withdrawals are disabled
 | ||||
|           await liquity.troveManager.connect(userWallet).liquidateTroves(90, { | ||||
|             gasLimit: helpers.MAX_GAS, | ||||
|           }); | ||||
| 
 | ||||
|           // Fast forward in time so we have an LQTY gain
 | ||||
|           await provider.send("evm_increaseTime", [600]); | ||||
|           await provider.send("evm_mine"); | ||||
| 
 | ||||
|           // Create another Stability Pool deposit so that LQTY gains are realized
 | ||||
|           // See: https://github.com/liquity/dev/#lqty-reward-events-and-payouts
 | ||||
|           const tempDsa = await buildDSAv2(userWallet.address); | ||||
|           await helpers.sendToken( | ||||
|             liquity.lusdToken, | ||||
|             amount, | ||||
|             contracts.STABILITY_POOL_ADDRESS, | ||||
|             tempDsa.address | ||||
|           ); | ||||
|           await tempDsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells([stabilityDepositSpell]), userWallet.address); | ||||
| 
 | ||||
|           const ethGain = await liquity.stabilityPool.getDepositorETHGain( | ||||
|             dsa.address | ||||
|           ); | ||||
|           const lqtyGain = await liquity.stabilityPool.getDepositorLQTYGain( | ||||
|             dsa.address | ||||
|           ); | ||||
| 
 | ||||
|           const stabilityWithdrawSpell = { | ||||
|             connector: helpers.LIQUITY_CONNECTOR, | ||||
|             method: "stabilityWithdraw", | ||||
|             args: [withdrawAmount, setWithdrawId, setEthGainId, setLqtyGainId], | ||||
|           }; | ||||
|           const spells = [stabilityDepositSpell, stabilitWithdrawSpell]; | ||||
| 
 | ||||
|           const castTx = await dsa | ||||
|           const withdrawTx = await dsa | ||||
|             .connect(userWallet) | ||||
|             .cast(...encodeSpells(spells), userWallet.address); | ||||
|             .cast( | ||||
|               ...encodeSpells([stabilityWithdrawSpell]), | ||||
|               userWallet.address | ||||
|             ); | ||||
| 
 | ||||
|           const receipt = await castTx.wait(); | ||||
|           const receipt = await withdrawTx.wait(); | ||||
|           const castLogEvent = receipt.events.find((e) => e.event === "LogCast") | ||||
|             .args; | ||||
|           const expectedEventParams = ethers.utils.defaultAbiCoder.encode( | ||||
|             ["address", "uint256", "uint256", "uint256", "uint256"], | ||||
|             [ | ||||
|               "address", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|               "uint256", | ||||
|             ], | ||||
|             [ | ||||
|               userWallet.address, | ||||
|               withdrawAmount, | ||||
|               ethGain, | ||||
|               lqtyGain, | ||||
|               setWithdrawId, | ||||
|               setEthGainId, | ||||
|               setLqtyGainId, | ||||
|             ] | ||||
|           ); | ||||
|           expect(castLogEvent.eventNames[1]).eq( | ||||
|             "LogStabilityWithdraw(address,uint256,uint256,uint256,uint256)" | ||||
|           expect(castLogEvent.eventNames[0]).eq( | ||||
|             "LogStabilityWithdraw(address,uint256,uint256,uint256,uint256,uint256,uint256)" | ||||
|           ); | ||||
|           expect(castLogEvent.eventParams[1]).eq(expectedEventParams); | ||||
|           expect(castLogEvent.eventParams[0]).eq(expectedEventParams); | ||||
|         }); | ||||
|       }); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Edward Mulraney
						Edward Mulraney