Files
dodo-contractV2/contracts/SmartRoute/DVMProxy.sol

100 lines
3.0 KiB
Solidity
Raw Normal View History

2020-10-23 17:11:50 +08:00
/*
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
pragma solidity 0.6.9;
2020-11-20 18:58:35 +08:00
import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol";
2020-10-23 17:11:50 +08:00
import {IERC20} from "../intf/IERC20.sol";
import {SafeERC20} from "../lib/SafeERC20.sol";
import {SafeMath} from "../lib/SafeMath.sol";
import {DecimalMath} from "../lib/DecimalMath.sol";
2020-11-20 18:58:35 +08:00
contract DVMProxy {
2020-10-23 17:11:50 +08:00
using SafeMath for uint256;
using SafeERC20 for IERC20;
function sellBaseOnDVM(
2020-11-05 00:26:45 +08:00
address DVMAddress,
2020-10-23 17:11:50 +08:00
address to,
uint256 baseAmount,
uint256 minReceive
) public returns (uint256 receiveAmount) {
2020-11-20 18:58:35 +08:00
IERC20(IDVM(DVMAddress)._BASE_TOKEN_()).safeTransferFrom(
msg.sender,
DVMAddress,
baseAmount
);
receiveAmount = IDVM(DVMAddress).sellBase(to);
2020-10-23 17:11:50 +08:00
require(receiveAmount >= minReceive, "RECEIVE_NOT_ENOUGH");
return receiveAmount;
}
function sellQuoteOnDVM(
2020-11-05 00:26:45 +08:00
address DVMAddress,
2020-10-23 17:11:50 +08:00
address to,
uint256 quoteAmount,
uint256 minReceive
) public returns (uint256 receiveAmount) {
2020-11-20 18:58:35 +08:00
IERC20(IDVM(DVMAddress)._QUOTE_TOKEN_()).safeTransferFrom(
2020-10-23 17:11:50 +08:00
msg.sender,
2020-11-18 17:51:50 +08:00
DVMAddress,
2020-10-23 17:11:50 +08:00
quoteAmount
);
2020-11-20 18:58:35 +08:00
receiveAmount = IDVM(DVMAddress).sellQuote(to);
2020-10-23 17:11:50 +08:00
require(receiveAmount >= minReceive, "RECEIVE_NOT_ENOUGU");
return receiveAmount;
}
function depositToDVM(
2020-11-05 00:26:45 +08:00
address DVMAddress,
2020-10-24 12:44:51 +08:00
address to,
2020-10-23 17:11:50 +08:00
uint256 baseAmount,
uint256 quoteAmount
) public returns (uint256 shares) {
uint256 adjustedBaseAmount;
uint256 adjustedQuoteAmount;
2020-11-20 18:58:35 +08:00
(uint256 baseReserve, uint256 quoteReserve) = IDVM(DVMAddress).getVaultReserve();
2020-10-23 17:11:50 +08:00
if (quoteReserve == 0 && baseReserve == 0) {
adjustedBaseAmount = baseAmount;
adjustedQuoteAmount = quoteAmount;
}
if (quoteReserve == 0 && baseReserve > 0) {
adjustedBaseAmount = baseAmount;
adjustedQuoteAmount = 0;
}
if (quoteReserve > 0 && baseReserve > 0) {
uint256 baseIncreaseRatio = DecimalMath.divFloor(baseAmount, baseReserve);
uint256 quoteIncreaseRatio = DecimalMath.divFloor(quoteAmount, quoteReserve);
2020-10-24 12:44:51 +08:00
if (baseIncreaseRatio <= quoteIncreaseRatio) {
adjustedBaseAmount = baseAmount;
adjustedQuoteAmount = DecimalMath.mulFloor(quoteReserve, baseIncreaseRatio);
} else {
adjustedQuoteAmount = quoteAmount;
adjustedBaseAmount = DecimalMath.mulFloor(baseReserve, quoteIncreaseRatio);
}
2020-10-23 17:11:50 +08:00
}
2020-10-24 12:44:51 +08:00
2020-11-20 18:58:35 +08:00
IERC20(IDVM(DVMAddress)._BASE_TOKEN_()).safeTransferFrom(
2020-10-24 12:44:51 +08:00
msg.sender,
2020-11-20 18:58:35 +08:00
DVMAddress,
2020-10-24 12:44:51 +08:00
adjustedBaseAmount
);
2020-11-20 18:58:35 +08:00
IERC20(IDVM(DVMAddress)._QUOTE_TOKEN_()).safeTransferFrom(
2020-10-24 12:44:51 +08:00
msg.sender,
2020-11-20 18:58:35 +08:00
DVMAddress,
2020-10-24 12:44:51 +08:00
adjustedQuoteAmount
);
2020-11-20 18:58:35 +08:00
shares = IDVM(DVMAddress).buyShares(to);
2020-11-05 14:10:59 +08:00
return shares;
2020-10-23 17:11:50 +08:00
}
}