Skip to content

Commit 3323a1a

Browse files
committed
Handle ETH/WETH dealer token conversion for dealer
1 parent 91938e2 commit 3323a1a

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

contracts/SignalBuyContract.sol

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
1010

1111
import "./interfaces/ISignalBuyContract.sol";
1212
import "./interfaces/IWeth.sol";
13+
import { Asset } from "./utils/Asset.sol";
1314
import "./utils/BaseLibEIP712.sol";
1415
import "./utils/LibConstant.sol";
1516
import "./utils/LibSignalBuyContractOrderStorage.sol";
@@ -23,6 +24,7 @@ import "./utils/SignatureValidator.sol";
2324
contract SignalBuyContract is ISignalBuyContract, BaseLibEIP712, SignatureValidator, ReentrancyGuard, Ownable {
2425
using SafeMath for uint256;
2526
using SafeERC20 for IERC20;
27+
using Asset for address;
2628

2729
IWETH public immutable weth;
2830
uint256 public immutable factorActivateDelay;
@@ -145,7 +147,7 @@ contract SignalBuyContract is ISignalBuyContract, BaseLibEIP712, SignatureValida
145147
bytes calldata _orderUserSig,
146148
TraderParams calldata _params,
147149
CoordinatorParams calldata _crdParams
148-
) external override nonReentrant returns (uint256, uint256) {
150+
) external payable override nonReentrant returns (uint256, uint256) {
149151
bytes32 orderHash = getEIP712Hash(SignalBuyContractLibEIP712._getOrderStructHash(_order));
150152

151153
_validateOrder(_order, orderHash, _orderUserSig);
@@ -267,18 +269,53 @@ contract SignalBuyContract is ISignalBuyContract, BaseLibEIP712, SignatureValida
267269
uint256 tokenlonFee = _mulFactor(_settlement.dealerTokenAmount, tokenlonFeeFactor);
268270
// 2. Fee for SignalBuy, including gas fee and strategy fee
269271
uint256 dealerFee = _mulFactor(_settlement.dealerTokenAmount, _settlement.gasFeeFactor + _settlement.dealerStrategyFeeFactor);
270-
uint256 dealerTokenForUser = _settlement.dealerTokenAmount.sub(tokenlonFee).sub(dealerFee);
272+
uint256 dealerTokenForUserAndTokenlon = _settlement.dealerTokenAmount.sub(dealerFee);
273+
uint256 dealerTokenForUser = dealerTokenForUserAndTokenlon.sub(tokenlonFee);
271274
require(dealerTokenForUser >= _settlement.minDealerTokenAmount, "SignalBuyContract: dealer token amount not enough");
272275

273276
// trader -> user
274-
_settlement.dealerToken.safeTransferFrom(_settlement.trader, _settlement.user, dealerTokenForUser);
277+
address _weth = address(weth); // cache
278+
if (address(_settlement.dealerToken).isETH()) {
279+
if (msg.value > 0) {
280+
// User wants ETH and dealer pays in ETH
281+
require(msg.value == dealerTokenForUserAndTokenlon, "SignalBuyContract: mismatch dealer token (ETH) amount");
282+
} else {
283+
// User wants ETH but dealer pays in WETH
284+
IERC20(_weth).safeTransferFrom(_settlement.trader, address(this), dealerTokenForUserAndTokenlon);
285+
weth.withdraw(dealerTokenForUserAndTokenlon);
286+
}
287+
// Send ETH to user
288+
LibConstant.ETH_ADDRESS.transferTo(payable(_settlement.user), dealerTokenForUser);
289+
} else if (address(_settlement.dealerToken) == _weth) {
290+
if (msg.value > 0) {
291+
// User wants WETH but dealer pays in ETH
292+
require(msg.value == dealerTokenForUserAndTokenlon, "SignalBuyContract: mismatch dealer token (ETH) amount");
293+
weth.deposit{ value: dealerTokenForUserAndTokenlon }();
294+
weth.transfer(_settlement.user, dealerTokenForUser);
295+
} else {
296+
// User wants WETH and dealer pays in WETH
297+
IERC20(_weth).safeTransferFrom(_settlement.trader, _settlement.user, dealerTokenForUser);
298+
}
299+
} else {
300+
_settlement.dealerToken.safeTransferFrom(_settlement.trader, _settlement.user, dealerTokenForUser);
301+
}
275302

276303
// user -> recipient
277304
_settlement.userToken.safeTransferFrom(_settlement.user, _settlement.recipient, _settlement.userTokenAmount);
278305

279306
// Collect user fee (charged in dealer token)
280307
if (tokenlonFee > 0) {
281-
_settlement.dealerToken.safeTransferFrom(_settlement.trader, _feeCollector, tokenlonFee);
308+
if (address(_settlement.dealerToken).isETH()) {
309+
LibConstant.ETH_ADDRESS.transferTo(payable(_feeCollector), tokenlonFee);
310+
} else if (address(_settlement.dealerToken) == _weth) {
311+
if (msg.value > 0) {
312+
weth.transfer(_feeCollector, tokenlonFee);
313+
} else {
314+
weth.transferFrom(_settlement.trader, _feeCollector, tokenlonFee);
315+
}
316+
} else {
317+
_settlement.dealerToken.safeTransferFrom(_settlement.trader, _feeCollector, tokenlonFee);
318+
}
282319
}
283320

284321
// bypass stack too deep error

contracts/interfaces/ISignalBuyContract.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ interface ISignalBuyContract {
7979
bytes calldata _orderUserSig,
8080
TraderParams calldata _params,
8181
CoordinatorParams calldata _crdParams
82-
) external returns (uint256, uint256);
82+
) external payable returns (uint256, uint256);
8383

8484
/// @notice Cancel an order
8585
/// @notice Only user proxy can call

0 commit comments

Comments
 (0)