/ contracts / finance / external / LiquiditySwap.sol
LiquiditySwap.sol
  1  pragma solidity >=0.6.0;
  2  pragma experimental ABIEncoderV2;
  3  
  4  import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
  5  import "../../interfaces/IERC20.sol";
  6  import "../../interfaces/ICreditToken.sol";
  7  import "../../interfaces/ICreditProvider.sol";
  8  import "../../interfaces/external/axial/ISwap.sol";
  9  
 10  
 11  //https://raw.githubusercontent.com/nerve-finance/contracts/main/SwapUtils.sol
 12  
 13  /*
 14      - owner of SwapFlashLoan contracts need to
 15          - upgrade Swap.sol 
 16          - mint enough lp tokens to cover enough requested stables
 17              - redeem lp tokens for stables
 18          - call swapTokenForCredit function on desired credit provider
 19              - hold as long as desired, redeem debt for stables at interest
 20              - deposit stables back to desired lp pool
 21  
 22          - call swapForExchangeBalance(uint value) if desire for exchange balance for using options
 23  
 24          - when redeeming (requestWithdraw) need to factor in lp:axial holder profit spit in contract
 25              -25% sent to axial holders
 26                  - seperate contract that holds the funds before its sent back to sAxial holders?
 27                      - claiamable contract that will allow saxial stakers to claim their share relative to their sAxial ownership
 28              -75% deposited back into liquidity pool
 29  
 30          - assumptions
 31              - apy on liquidity swap > base line aby on pool with no liquidity swap
 32          
 33          - pros:
 34              - more swap volume
 35              - more revenue
 36              - stakeholder in governance tokens for axial?
 37              - can burn credit for exchange balance and use it to pursue options strategies
 38          - cons:
 39              - non zero increase in credit risk reliant upon demand for option buyers and traders using DOD
 40  */
 41  
 42  contract LiquiditySwap is OwnableUpgradeable {
 43      address creditProvider;
 44      address creditToken;
 45      address tokenPool;
 46      address govToken;
 47  
 48      constructor(address _creditProvider, address _creditToken, address _tokenPool, address _govToken, address owner) public {
 49          creditProvider = _creditProvider;
 50          creditToken = _creditToken;
 51          tokenPool = _tokenPool;
 52          govToken = _govToken;
 53          transferOwnership(owner);
 54      }
 55  
 56      modifier onlyGovernance() {
 57          require(msg.sender == govToken, "only gov");
 58          _;
 59      }
 60  
 61      function executeLiquiditySwap(uint256 amountUnderlying) onlyGovernance external {
 62          ISwap(tokenPool).mintForLiquidtySwap(amountUnderlying);
 63          address[] memory pooledTokens = ISwap(tokenPool).getPooledTokens();
 64          address lpToken = ISwap(tokenPool).getLpToken();
 65  
 66          uint256[] memory minAmounts = new uint256[](pooledTokens.length);
 67          for (uint i=0; i<pooledTokens.length;i++) {
 68              minAmounts[i] = 0;
 69          }
 70          ISwap(tokenPool).removeLiquidity(
 71              IERC20(lpToken).balanceOf(address(this)),
 72              minAmounts,
 73              0
 74          );
 75  
 76          for (uint i=0; i<pooledTokens.length;i++) {
 77              ICreditProvider(creditProvider).swapTokenForCredit(
 78                  address(this),
 79                  pooledTokens[i],
 80                  IERC20(pooledTokens[i]).balanceOf(address(this))
 81              );
 82          }
 83      }
 84  
 85      function executeCreditSwap(uint256 value) onlyGovernance external{
 86          //burning credit for exchange balance + interest, NOTE: INTEREST PAYOUT PERIOD WILL RESET WHEN CALLED
 87          ICreditToken(creditToken).swapForExchangeBalance(value);
 88      }
 89  
 90      function executeRequestWithdraw() onlyGovernance external {
 91          //burning credit for underlying tokens + interest, NOTE: INTEREST PAYOUT PERIOD WILL RESET WHEN CALLED
 92          ICreditToken(creditToken).requestWithdraw();
 93      }
 94  
 95      function executeTransfer(address token, address to, uint256 amount) onlyOwner external {
 96          if (amount > 0) {
 97              IERC20(token).transfer(to, amount);
 98          }
 99      }
100  }