Files
dodo-contractV2/contracts/SmartRoute/adapter/UniAdapter.sol

49 lines
1.9 KiB
Solidity
Raw Normal View History

2021-01-14 18:31:43 +08:00
/*
2021-05-12 15:04:14 +08:00
2021-01-14 18:31:43 +08:00
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
2021-05-12 15:04:14 +08:00
2021-01-14 18:31:43 +08:00
*/
pragma solidity 0.6.9;
import {IDODOAdapter} from "../intf/IDODOAdapter.sol";
import {IUni} from "../intf/IUni.sol";
import {IERC20} from "../../intf/IERC20.sol";
import {SafeMath} from "../../lib/SafeMath.sol";
contract UniAdapter is IDODOAdapter {
using SafeMath for uint;
//fromToken == token0
2021-05-11 15:03:40 +08:00
function sellBase(address to, address pool, bytes memory) external override {
2021-01-14 18:31:43 +08:00
address baseToken = IUni(pool).token0();
(uint reserveIn, uint reserveOut,) = IUni(pool).getReserves();
require(reserveIn > 0 && reserveOut > 0, 'UniAdapter: INSUFFICIENT_LIQUIDITY');
uint balance0 = IERC20(baseToken).balanceOf(pool);
uint sellBaseAmount = balance0 - reserveIn;
uint sellBaseAmountWithFee = sellBaseAmount.mul(997);
uint numerator = sellBaseAmountWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(sellBaseAmountWithFee);
2021-05-12 14:56:50 +08:00
uint receiveQuoteAmount = numerator / denominator;
2021-01-14 18:31:43 +08:00
IUni(pool).swap(0, receiveQuoteAmount, to, new bytes(0));
}
//fromToken == token1
2021-05-11 15:03:40 +08:00
function sellQuote(address to, address pool, bytes memory) external override {
2021-01-14 18:31:43 +08:00
address quoteToken = IUni(pool).token1();
(uint reserveOut, uint reserveIn,) = IUni(pool).getReserves();
require(reserveIn > 0 && reserveOut > 0, 'UniAdapter: INSUFFICIENT_LIQUIDITY');
uint balance1 = IERC20(quoteToken).balanceOf(pool);
uint sellQuoteAmount = balance1 - reserveIn;
uint sellQuoteAmountWithFee = sellQuoteAmount.mul(997);
uint numerator = sellQuoteAmountWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(sellQuoteAmountWithFee);
2021-05-12 14:56:50 +08:00
uint receiveBaseAmount = numerator / denominator;
2021-01-14 18:31:43 +08:00
IUni(pool).swap(receiveBaseAmount, 0, to, new bytes(0));
}
}