mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	chore: consolidate functions to deposit and swap
This commit is contained in:
		
							parent
							
								
									b8fc97f6c0
								
							
						
					
					
						commit
						531ac64ba5
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
pragma solidity ^0.7.6;
 | 
			
		||||
 | 
			
		||||
import { DSMath } from "../common/math.sol";
 | 
			
		||||
import { Basic } from "../common/basic.sol";
 | 
			
		||||
import { DSMath } from "../../common/math.sol";
 | 
			
		||||
import { Basic } from "../../common/basic.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract Helpers is DSMath, Basic {
 | 
			
		||||
	address internal constant mUsdToken =
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ pragma solidity ^0.7.6;
 | 
			
		|||
import { Helpers } from "./helpers.sol";
 | 
			
		||||
import { Events } from "./events.sol";
 | 
			
		||||
import { IMasset, ISavingsContractV2, IBoostedSavingsVault, IFeederPool } from "./interface.sol";
 | 
			
		||||
import { TokenInterface } from "../common/interfaces.sol";
 | 
			
		||||
import { TokenInterface } from "../../common/interfaces.sol";
 | 
			
		||||
 | 
			
		||||
abstract contract mStableResolver is Events, Helpers {
 | 
			
		||||
	//
 | 
			
		||||
| 
						 | 
				
			
			@ -17,51 +17,38 @@ abstract contract mStableResolver is Events, Helpers {
 | 
			
		|||
    ****************************************/
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Deposit to Save via mUSD
 | 
			
		||||
	 * @dev Deposit to Save via mUSD or bAsset
 | 
			
		||||
	 * @notice Deposits token supported by mStable to Save
 | 
			
		||||
	 * @param _token Address of token to deposit
 | 
			
		||||
	 * @param _amount Amount of token to deposit
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint/deposit, equal to _amount if mUSD
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function deposit(address _token, uint256 _amount)
 | 
			
		||||
		external
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		return _deposit(_token, _amount, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Deposit to Save via bAsset
 | 
			
		||||
	 * @notice Deposits token, requires _minOut for minting
 | 
			
		||||
	 * @param _token Address of token to deposit
 | 
			
		||||
	 * @param _amount Amount of token to deposit
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function depositViaMint(
 | 
			
		||||
	function deposit(
 | 
			
		||||
		address _token,
 | 
			
		||||
		uint256 _amount,
 | 
			
		||||
		uint256 _minOut
 | 
			
		||||
	) external returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
		//
 | 
			
		||||
		require(
 | 
			
		||||
			IMasset(mUsdToken).bAssetIndexes(_token) != 0,
 | 
			
		||||
			"Token not a bAsset"
 | 
			
		||||
		);
 | 
			
		||||
		uint256 mintedAmount = _amount;
 | 
			
		||||
 | 
			
		||||
		approve(TokenInterface(_token), mUsdToken, _amount);
 | 
			
		||||
		uint256 mintedAmount = IMasset(mUsdToken).mint(
 | 
			
		||||
			_token,
 | 
			
		||||
			_amount,
 | 
			
		||||
			_minOut,
 | 
			
		||||
			address(this)
 | 
			
		||||
		);
 | 
			
		||||
		// Check if needs to be minted first
 | 
			
		||||
		if (IMasset(mUsdToken).bAssetIndexes(_token) != 0) {
 | 
			
		||||
			// mint first
 | 
			
		||||
			approve(TokenInterface(_token), mUsdToken, _amount);
 | 
			
		||||
			mintedAmount = IMasset(mUsdToken).mint(
 | 
			
		||||
				_token,
 | 
			
		||||
				_amount,
 | 
			
		||||
				_minOut,
 | 
			
		||||
				address(this)
 | 
			
		||||
			);
 | 
			
		||||
		} else {
 | 
			
		||||
			require(mintedAmount >= _minOut, "mintedAmount < _minOut");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return _deposit(_token, mintedAmount, mUsdToken);
 | 
			
		||||
		return _deposit(_token, mintedAmount, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -100,54 +87,36 @@ abstract contract mStableResolver is Events, Helpers {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Withdraw from Save to mUSD
 | 
			
		||||
	 * @dev Withdraw from Save to mUSD or bAsset
 | 
			
		||||
	 * @notice Withdraws from Save Vault to mUSD
 | 
			
		||||
	 * @param _token Address of token to withdraw
 | 
			
		||||
	 * @param _credits Credits to withdraw
 | 
			
		||||
	 * @param _minOut Minimum amount of token to withdraw
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function withdraw(uint256 _credits)
 | 
			
		||||
		external
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 amountWithdrawn = _withdraw(_credits);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogWithdraw()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountWithdrawn, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Withdraw from Save to bAsset
 | 
			
		||||
	 * @notice Withdraws from Save Vault to bAsset
 | 
			
		||||
	 * @param _token bAsset to withdraw to
 | 
			
		||||
	 * @param _credits Credits to withdraw
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function withdrawViaRedeem(
 | 
			
		||||
	function withdraw(
 | 
			
		||||
		address _token,
 | 
			
		||||
		uint256 _credits,
 | 
			
		||||
		uint256 _minOut
 | 
			
		||||
	) external returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
		//
 | 
			
		||||
		require(
 | 
			
		||||
			IMasset(mUsdToken).bAssetIndexes(_token) != 0,
 | 
			
		||||
			"Token not a bAsset"
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		uint256 amountWithdrawn = _withdraw(_credits);
 | 
			
		||||
		uint256 amountRedeemed = IMasset(mUsdToken).redeem(
 | 
			
		||||
			_token,
 | 
			
		||||
			amountWithdrawn,
 | 
			
		||||
			_minOut,
 | 
			
		||||
			address(this)
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogRedeem()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountRedeemed, _token);
 | 
			
		||||
		// Check if needs to be redeemed
 | 
			
		||||
		if (IMasset(mUsdToken).bAssetIndexes(_token) != 0) {
 | 
			
		||||
			amountWithdrawn = IMasset(mUsdToken).redeem(
 | 
			
		||||
				_token,
 | 
			
		||||
				amountWithdrawn,
 | 
			
		||||
				_minOut,
 | 
			
		||||
				address(this)
 | 
			
		||||
			);
 | 
			
		||||
		} else {
 | 
			
		||||
			require(amountWithdrawn >= _minOut, "amountWithdrawn < _minOut");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogWithdraw()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountWithdrawn, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -17,51 +17,38 @@ abstract contract PmStableResolver is Events, Helpers {
 | 
			
		|||
    ****************************************/
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Deposit to Save via mUSD
 | 
			
		||||
	 * @dev Deposit to Save via mUSD or bAsset
 | 
			
		||||
	 * @notice Deposits token supported by mStable to Save
 | 
			
		||||
	 * @param _token Address of token to deposit
 | 
			
		||||
	 * @param _amount Amount of token to deposit
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint/deposit, equal to _amount if mUSD
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function deposit(address _token, uint256 _amount)
 | 
			
		||||
		external
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		return _deposit(_token, _amount, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Deposit to Save via bAsset
 | 
			
		||||
	 * @notice Deposits token, requires _minOut for minting
 | 
			
		||||
	 * @param _token Address of token to deposit
 | 
			
		||||
	 * @param _amount Amount of token to deposit
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function depositViaMint(
 | 
			
		||||
	function deposit(
 | 
			
		||||
		address _token,
 | 
			
		||||
		uint256 _amount,
 | 
			
		||||
		uint256 _minOut
 | 
			
		||||
	) external returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
		//
 | 
			
		||||
		require(
 | 
			
		||||
			IMasset(mUsdToken).bAssetIndexes(_token) != 0,
 | 
			
		||||
			"Token not a bAsset"
 | 
			
		||||
		);
 | 
			
		||||
		uint256 mintedAmount = _amount;
 | 
			
		||||
 | 
			
		||||
		approve(TokenInterface(_token), mUsdToken, _amount);
 | 
			
		||||
		uint256 mintedAmount = IMasset(mUsdToken).mint(
 | 
			
		||||
			_token,
 | 
			
		||||
			_amount,
 | 
			
		||||
			_minOut,
 | 
			
		||||
			address(this)
 | 
			
		||||
		);
 | 
			
		||||
		// Check if needs to be minted first
 | 
			
		||||
		if (IMasset(mUsdToken).bAssetIndexes(_token) != 0) {
 | 
			
		||||
			// mint first
 | 
			
		||||
			approve(TokenInterface(_token), mUsdToken, _amount);
 | 
			
		||||
			mintedAmount = IMasset(mUsdToken).mint(
 | 
			
		||||
				_token,
 | 
			
		||||
				_amount,
 | 
			
		||||
				_minOut,
 | 
			
		||||
				address(this)
 | 
			
		||||
			);
 | 
			
		||||
		} else {
 | 
			
		||||
			require(mintedAmount >= _minOut, "mintedAmount < _minOut");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return _deposit(_token, mintedAmount, mUsdToken);
 | 
			
		||||
		return _deposit(_token, mintedAmount, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -100,54 +87,36 @@ abstract contract PmStableResolver is Events, Helpers {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Withdraw from Save to mUSD
 | 
			
		||||
	 * @dev Withdraw from Save to mUSD or bAsset
 | 
			
		||||
	 * @notice Withdraws from Save Vault to mUSD
 | 
			
		||||
	 * @param _token Address of token to withdraw
 | 
			
		||||
	 * @param _credits Credits to withdraw
 | 
			
		||||
	 * @param _minOut Minimum amount of token to withdraw
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function withdraw(uint256 _credits)
 | 
			
		||||
		external
 | 
			
		||||
		returns (string memory _eventName, bytes memory _eventParam)
 | 
			
		||||
	{
 | 
			
		||||
		uint256 amountWithdrawn = _withdraw(_credits);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogWithdraw()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountWithdrawn, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @dev Withdraw from Save to bAsset
 | 
			
		||||
	 * @notice Withdraws from Save Vault to bAsset
 | 
			
		||||
	 * @param _token bAsset to withdraw to
 | 
			
		||||
	 * @param _credits Credits to withdraw
 | 
			
		||||
	 * @param _minOut Minimum amount of token to mint
 | 
			
		||||
	 * @return _eventName Event name
 | 
			
		||||
	 * @return _eventParam Event parameters
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	function withdrawViaRedeem(
 | 
			
		||||
	function withdraw(
 | 
			
		||||
		address _token,
 | 
			
		||||
		uint256 _credits,
 | 
			
		||||
		uint256 _minOut
 | 
			
		||||
	) external returns (string memory _eventName, bytes memory _eventParam) {
 | 
			
		||||
		//
 | 
			
		||||
		require(
 | 
			
		||||
			IMasset(mUsdToken).bAssetIndexes(_token) != 0,
 | 
			
		||||
			"Token not a bAsset"
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		uint256 amountWithdrawn = _withdraw(_credits);
 | 
			
		||||
		uint256 amountRedeemed = IMasset(mUsdToken).redeem(
 | 
			
		||||
			_token,
 | 
			
		||||
			amountWithdrawn,
 | 
			
		||||
			_minOut,
 | 
			
		||||
			address(this)
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogRedeem()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountRedeemed, _token);
 | 
			
		||||
		// Check if needs to be redeemed
 | 
			
		||||
		if (IMasset(mUsdToken).bAssetIndexes(_token) != 0) {
 | 
			
		||||
			amountWithdrawn = IMasset(mUsdToken).redeem(
 | 
			
		||||
				_token,
 | 
			
		||||
				amountWithdrawn,
 | 
			
		||||
				_minOut,
 | 
			
		||||
				address(this)
 | 
			
		||||
			);
 | 
			
		||||
		} else {
 | 
			
		||||
			require(amountWithdrawn >= _minOut, "amountWithdrawn < _minOut");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_eventName = "LogWithdraw()";
 | 
			
		||||
		_eventParam = abi.encode(mUsdToken, amountWithdrawn, imUsdToken);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -367,7 +336,6 @@ abstract contract PmStableResolver is Events, Helpers {
 | 
			
		|||
		returns (uint256 amountWithdrawn)
 | 
			
		||||
	{
 | 
			
		||||
		// 1. Withdraw from Vault
 | 
			
		||||
		// approve(TokenInterface(imUsdVault), imUsdToken, _credits);
 | 
			
		||||
		IStakingRewardsWithPlatformToken(imUsdVault).withdraw(_credits);
 | 
			
		||||
 | 
			
		||||
		// 2. Withdraw from Save
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,14 +118,15 @@ describe("MStable", async () => {
 | 
			
		|||
      });
 | 
			
		||||
      it("Should deposit mUSD to Vault successfully", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = depositAmount;
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertDeposit("deposit", mUsdToken, depositAmount, dsaWallet0, wallet0);
 | 
			
		||||
        await executeAndAssertDeposit("deposit", mUsdToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should deposit DAI to Vault successfully (mUSD bAsset)", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = calcMinOut(depositAmount, 0.02);
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertDeposit("depositViaMint", daiToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
        await executeAndAssertDeposit("deposit", daiToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should deposit alUSD to Vault successfully (via Feeder Pool)", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
| 
						 | 
				
			
			@ -136,66 +137,25 @@ describe("MStable", async () => {
 | 
			
		|||
      });
 | 
			
		||||
      it("Should withdraw from Vault to mUSD", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [withdrawAmount]);
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should withdraw from Vault to DAI (mUSD bAsset)", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
 | 
			
		||||
        const daiBalanceBefore = await daiToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("DAI balance before: ", toEther(daiBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const spells = [
 | 
			
		||||
          {
 | 
			
		||||
            connector: connectorName,
 | 
			
		||||
            method: "withdrawViaRedeem",
 | 
			
		||||
            args: [daiToken.address, withdrawAmount, minOut]
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), DEAD_ADDRESS);
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        const daiBalanceAfter = await daiToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("DAI balance after: ", toEther(daiBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
        expect(daiBalanceAfter).to.gt(daiBalanceBefore);
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should withdraw from Vault to alUSD (via Feeder Pool)", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
        const path = getToken("alUSD").feederPool;
 | 
			
		||||
 | 
			
		||||
        const alusdBalanceBefore = await alusdToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("Balance before: ", toEther(alusdBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const spells = [
 | 
			
		||||
          {
 | 
			
		||||
            connector: connectorName,
 | 
			
		||||
            method: "withdrawViaSwap",
 | 
			
		||||
            args: [alusdToken.address, withdrawAmount, minOut, getToken("alUSD").feederPool]
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), DEAD_ADDRESS);
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        const alusdBalanceAfter = await alusdToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("alUSD balance after: ", toEther(alusdBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
        expect(alusdBalanceAfter).to.gt(alusdBalanceBefore);
 | 
			
		||||
        await executeAndAssertWithdraw("withdrawViaSwap", alusdToken, withdrawAmount, dsaWallet0, wallet0, [
 | 
			
		||||
          minOut,
 | 
			
		||||
          path
 | 
			
		||||
        ]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should claim Rewards", async () => {
 | 
			
		||||
        const mtaBalanceBefore = await mtaToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,14 +104,14 @@ export const executeAndAssertDeposit = async (
 | 
			
		|||
 | 
			
		||||
export const executeAndAssertWithdraw = async (
 | 
			
		||||
  method: string,
 | 
			
		||||
  tokenFrom: IERC20Minimal,
 | 
			
		||||
  tokenTo: IERC20Minimal,
 | 
			
		||||
  withdrawAmount: BigNumber,
 | 
			
		||||
  dsaWallet0: Contract,
 | 
			
		||||
  wallet0: Wallet,
 | 
			
		||||
  args: any[]
 | 
			
		||||
) => {
 | 
			
		||||
  const mUsdBalanceBefore = await tokenFrom.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance before: ", toEther(mUsdBalanceBefore));
 | 
			
		||||
  const tokenToBalanceBefore = await tokenTo.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance before: ", toEther(tokenToBalanceBefore));
 | 
			
		||||
 | 
			
		||||
  const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ export const executeAndAssertWithdraw = async (
 | 
			
		|||
    {
 | 
			
		||||
      connector: connectorName,
 | 
			
		||||
      method,
 | 
			
		||||
      args
 | 
			
		||||
      args: [tokenTo.address, withdrawAmount, ...(args ? args : [])]
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -129,9 +129,9 @@ export const executeAndAssertWithdraw = async (
 | 
			
		|||
  const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
  const mUsdBalanceAfter = await tokenFrom.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance after: ", toEther(mUsdBalanceAfter));
 | 
			
		||||
  const tokenToBalanceAfter = await tokenTo.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance after: ", toEther(tokenToBalanceAfter));
 | 
			
		||||
 | 
			
		||||
  expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
  expect(mUsdBalanceAfter).to.gt(mUsdBalanceBefore);
 | 
			
		||||
  expect(tokenToBalanceAfter).to.gt(tokenToBalanceBefore);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,14 +118,15 @@ describe("MStable", async () => {
 | 
			
		|||
      });
 | 
			
		||||
      it("Should deposit mUSD to Vault successfully", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = depositAmount;
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertDeposit("deposit", mUsdToken, depositAmount, dsaWallet0, wallet0);
 | 
			
		||||
        await executeAndAssertDeposit("deposit", mUsdToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should deposit DAI to Vault successfully (mUSD bAsset)", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = calcMinOut(depositAmount, 0.02);
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertDeposit("depositViaMint", daiToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
        await executeAndAssertDeposit("deposit", daiToken, depositAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should deposit FRAX to Vault successfully (via Feeder Pool)", async () => {
 | 
			
		||||
        const depositAmount = simpleToExactAmount(100);
 | 
			
		||||
| 
						 | 
				
			
			@ -136,66 +137,25 @@ describe("MStable", async () => {
 | 
			
		|||
      });
 | 
			
		||||
      it("Should withdraw from Vault to mUSD", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [withdrawAmount]);
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should withdraw from Vault to DAI (mUSD bAsset)", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
 | 
			
		||||
        const daiBalanceBefore = await daiToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("DAI balance before: ", toEther(daiBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const spells = [
 | 
			
		||||
          {
 | 
			
		||||
            connector: connectorName,
 | 
			
		||||
            method: "withdrawViaRedeem",
 | 
			
		||||
            args: [daiToken.address, withdrawAmount, minOut]
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), DEAD_ADDRESS);
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        const daiBalanceAfter = await daiToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("DAI balance after: ", toEther(daiBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
        expect(daiBalanceAfter).to.gt(daiBalanceBefore);
 | 
			
		||||
        await executeAndAssertWithdraw("withdraw", mUsdToken, withdrawAmount, dsaWallet0, wallet0, [minOut]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should withdraw from Vault to FRAX (via Feeder Pool)", async () => {
 | 
			
		||||
        const withdrawAmount = simpleToExactAmount(100);
 | 
			
		||||
        const minOut = simpleToExactAmount(1);
 | 
			
		||||
        const path = getToken("FRAX").feederPool;
 | 
			
		||||
 | 
			
		||||
        const fraxBalanceBefore = await fraxToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("FRAX balance before: ", toEther(fraxBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
 | 
			
		||||
        const spells = [
 | 
			
		||||
          {
 | 
			
		||||
            connector: connectorName,
 | 
			
		||||
            method: "withdrawViaSwap",
 | 
			
		||||
            args: [fraxToken.address, withdrawAmount, minOut, getToken("FRAX").feederPool]
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        const tx = await dsaWallet0.connect(wallet0).cast(...encodeSpells(spells), DEAD_ADDRESS);
 | 
			
		||||
 | 
			
		||||
        const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        const fraxBalanceAfter = await fraxToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
        console.log("FRAX balance after: ", toEther(fraxBalanceAfter));
 | 
			
		||||
 | 
			
		||||
        expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
        expect(fraxBalanceAfter).to.gt(fraxBalanceBefore);
 | 
			
		||||
        await executeAndAssertWithdraw("withdrawViaSwap", fraxToken, withdrawAmount, dsaWallet0, wallet0, [
 | 
			
		||||
          minOut,
 | 
			
		||||
          path
 | 
			
		||||
        ]);
 | 
			
		||||
      });
 | 
			
		||||
      it("Should claim Rewards", async () => {
 | 
			
		||||
        const mtaBalanceBefore = await mtaToken.balanceOf(dsaWallet0.address);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,14 +104,14 @@ export const executeAndAssertDeposit = async (
 | 
			
		|||
 | 
			
		||||
export const executeAndAssertWithdraw = async (
 | 
			
		||||
  method: string,
 | 
			
		||||
  tokenFrom: IERC20Minimal,
 | 
			
		||||
  tokenTo: IERC20Minimal,
 | 
			
		||||
  withdrawAmount: BigNumber,
 | 
			
		||||
  dsaWallet0: Contract,
 | 
			
		||||
  wallet0: Wallet,
 | 
			
		||||
  args: any[]
 | 
			
		||||
) => {
 | 
			
		||||
  const mUsdBalanceBefore = await tokenFrom.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance before: ", toEther(mUsdBalanceBefore));
 | 
			
		||||
  const tokenToBalanceBefore = await tokenTo.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance before: ", toEther(tokenToBalanceBefore));
 | 
			
		||||
 | 
			
		||||
  const imUsdVaultBalanceBefore = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("imUSD Vault balance before: ", toEther(imUsdVaultBalanceBefore));
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ export const executeAndAssertWithdraw = async (
 | 
			
		|||
    {
 | 
			
		||||
      connector: connectorName,
 | 
			
		||||
      method,
 | 
			
		||||
      args
 | 
			
		||||
      args: [tokenTo.address, withdrawAmount, ...(args ? args : [])]
 | 
			
		||||
    }
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -129,9 +129,9 @@ export const executeAndAssertWithdraw = async (
 | 
			
		|||
  const imUsdVaultBalanceAfter = await imUsdVault.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("imUSD Vault balance after: ", toEther(imUsdVaultBalanceAfter));
 | 
			
		||||
 | 
			
		||||
  const mUsdBalanceAfter = await tokenFrom.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance after: ", toEther(mUsdBalanceAfter));
 | 
			
		||||
  const tokenToBalanceAfter = await tokenTo.balanceOf(dsaWallet0.address);
 | 
			
		||||
  console.log("Balance after: ", toEther(tokenToBalanceAfter));
 | 
			
		||||
 | 
			
		||||
  expect(imUsdVaultBalanceAfter).to.be.eq(imUsdVaultBalanceBefore.sub(withdrawAmount));
 | 
			
		||||
  expect(mUsdBalanceAfter).to.gt(mUsdBalanceBefore);
 | 
			
		||||
  expect(tokenToBalanceAfter).to.gt(tokenToBalanceBefore);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user