use safe erc20 & new logGas
This commit is contained in:
@@ -15,12 +15,10 @@ import {IDODO} from "./intf/IDODO.sol";
|
||||
import {IERC20} from "./intf/IERC20.sol";
|
||||
import {IWETH} from "./intf/IWETH.sol";
|
||||
|
||||
|
||||
interface IDODOZoo {
|
||||
function getDODO(address baseToken, address quoteToken) external view returns (address);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @title DODO Eth Proxy
|
||||
* @author DODO Breeder
|
||||
@@ -112,7 +110,7 @@ contract DODOEthProxy is ReentrancyGuard {
|
||||
require(DODO != address(0), "DODO_NOT_EXIST");
|
||||
payTokenAmount = IDODO(DODO).queryBuyBaseToken(ethAmount);
|
||||
_transferIn(quoteTokenAddress, msg.sender, payTokenAmount);
|
||||
IERC20(quoteTokenAddress).approve(DODO, payTokenAmount);
|
||||
IERC20(quoteTokenAddress).safeApprove(DODO, payTokenAmount);
|
||||
IDODO(DODO).buyBaseToken(ethAmount, maxPayTokenAmount, "");
|
||||
IWETH(_WETH_).withdraw(ethAmount);
|
||||
msg.sender.transfer(ethAmount);
|
||||
@@ -127,7 +125,7 @@ contract DODOEthProxy is ReentrancyGuard {
|
||||
) external preventReentrant returns (uint256 receiveEthAmount) {
|
||||
address DODO = IDODOZoo(_DODO_ZOO_).getDODO(baseTokenAddress, _WETH_);
|
||||
require(DODO != address(0), "DODO_NOT_EXIST");
|
||||
IERC20(baseTokenAddress).approve(DODO, tokenAmount);
|
||||
IERC20(baseTokenAddress).safeApprove(DODO, tokenAmount);
|
||||
_transferIn(baseTokenAddress, msg.sender, tokenAmount);
|
||||
receiveEthAmount = IDODO(DODO).sellBaseToken(tokenAmount, minReceiveEthAmount, "");
|
||||
IWETH(_WETH_).withdraw(receiveEthAmount);
|
||||
|
||||
@@ -45,6 +45,22 @@ library SafeERC20 {
|
||||
);
|
||||
}
|
||||
|
||||
function safeApprove(
|
||||
IERC20 token,
|
||||
address spender,
|
||||
uint256 value
|
||||
) internal {
|
||||
// safeApprove should only be called when setting an initial allowance,
|
||||
// or when resetting it to zero. To increase and decrease it, use
|
||||
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
|
||||
// solhint-disable-next-line max-line-length
|
||||
require(
|
||||
(value == 0) || (token.allowance(address(this), spender) == 0),
|
||||
"SafeERC20: approve from non-zero to non-zero allowance"
|
||||
);
|
||||
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
|
||||
* on the return value: the return value is optional (but if data is returned, it must not be false).
|
||||
|
||||
Reference in New Issue
Block a user