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 }