|
// **** ADD LIQUIDITY **** |
|
function _addLiquidity( |
|
address tokenA, |
|
address tokenB, |
|
uint amountADesired, |
|
uint amountBDesired, |
|
uint /amountAMin, |
|
uint amountBMin |
|
) internal virtual returns (uint amountA, uint amountB) { |
|
// create the pair if it doesn't exist yet |
|
if (IOKCSwapFactory(factory).getPair(tokenA, tokenB) == address(0)) { |
|
IOKCSwapFactory(factory).createPair(tokenA, tokenB); |
|
} |
|
(uint reserveA, uint reserveB) = OKCSwapLibrary.getReserves(factory, tokenA, tokenB, pairCodeHash); |
|
if (reserveA == 0 && reserveB == 0) { |
|
(amountA, amountB) = (amountADesired, amountBDesired); |
|
} else { |
|
uint amountBOptimal = OKCSwapLibrary.quote(amountADesired, reserveA, reserveB); |
|
if (amountBOptimal <= amountBDesired) { |
|
require(amountBOptimal >= amountBMin, 'OKCSwapRouter: INSUFFICIENT_B_AMOUNT'); |
|
(amountA, amountB) = (amountADesired, amountBOptimal); |
|
} else { |
|
uint amountAOptimal = OKCSwapLibrary.quote(amountBDesired, reserveB, reserveA); |
|
assert(amountAOptimal <= amountADesired); |
|
require(amountAOptimal >= amountAMin, 'OKCSwapRouter: INSUFFICIENT_A_AMOUNT'); |
|
(amountA, amountB) = (amountAOptimal, amountBDesired); |
|
} |
|
} |
|
} |
|
function addLiquidity( |
|
address tokenA, |
|
address tokenB, |
|
uint amountADesired, |
|
uint amountBDesired, |
|
uint amountAMin, |
|
uint amountBMin, |
|
address to, |
|
uint deadline |
|
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { |
|
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); |
|
address pair = OKCSwapLibrary.pairFor(factory, tokenA, tokenB, pairCodeHash); |
|
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); |
|
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); |
|
liquidity = IOKCSwapPair(pair).mint(to); |
|
} |
|
function addLiquidityOKT( # add liquidity for to token: (0xb0557906c617f0048A700758606f64b33D0C41A6) |
|
address token, |
|
uint amountTokenDesired, |
|
uint amountTokenMin, |
|
uint amountOKTMin, |
|
address to, |
|
uint deadline |
|
) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountOKT, uint liquidity) { |
|
(amountToken, amountOKT) = _addLiquidity( |
|
token, |
|
WOKT, |
|
amountTokenDesired, |
|
msg.value, |
|
amountTokenMin, |
|
amountOKTMin |
|
); |
|
address pair = OKCSwapLibrary.pairFor(factory, token, WOKT, pairCodeHash); |
|
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); |
|
IWOKT(WOKT).deposit{value: amountOKT}(); |
|
assert(IWOKT(WOKT).transfer(pair, amountOKT)); |
|
liquidity = IOKCSwapPair(pair).mint(to); |
|
// refund dust OKT, if any |
|
if (msg.value > amountOKT) TransferHelper.safeTransferOKT(msg.sender, msg.value - amountOKT); |
|
} |
|
|
|
|