Skip to content

Commit

Permalink
Merge pull request #47 from clober-dex/feat/router
Browse files Browse the repository at this point in the history
feat: implement batch limit order at router
  • Loading branch information
JhChoy committed May 15, 2023
2 parents ad80093 + 2db3a97 commit 1bcaf60
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 52 deletions.
69 changes: 55 additions & 14 deletions contracts/MarketRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,24 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
mapping(address => bool) private _registeredMarkets;

modifier checkDeadline(uint64 deadline) {
_checkDeadline(deadline);
_;
}

function _checkDeadline(uint64 deadline) internal view {
if (block.timestamp > deadline) {
revert Errors.CloberError(Errors.DEADLINE);
}
}

modifier flushNative() {
_;
if (address(this).balance > 0) {
(bool success, ) = msg.sender.call{value: address(this).balance}("");
if (!success) {
revert Errors.CloberError(Errors.FAILED_TO_SEND_VALUE);
}
}
}

constructor(address factory) {
Expand All @@ -48,11 +62,11 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
revert Errors.CloberError(Errors.ACCESS);
}

(address payer, bool useNative) = abi.decode(data, (address, bool));
(address payer, bool useNative, uint256 nativeToRemain) = abi.decode(data, (address, bool, uint256));

// transfer input tokens
if (useNative) {
uint256 nativeAmount = address(this).balance - msg.value;
uint256 nativeAmount = address(this).balance - nativeToRemain;
(inputAmount, nativeAmount) = nativeAmount > inputAmount
? (0, inputAmount)
: (inputAmount - nativeAmount, nativeAmount);
Expand All @@ -63,19 +77,31 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
if (inputAmount > 0) {
IERC20(inputToken).safeTransferFrom(payer, msg.sender, inputAmount);
}
}

function limitOrder(
GeneralLimitOrderParams[] calldata limitOrderParamsList,
ClaimOrderParams[] calldata claimParamsList
) external payable flushNative returns (uint256[] memory orderIds) {
orderIds = new uint256[](limitOrderParamsList.length);
_claim(claimParamsList);
uint256 nativeToRemain;
for (uint256 i = 0; i < limitOrderParamsList.length; ++i) {
_checkDeadline(limitOrderParamsList[i].params.deadline);
nativeToRemain += uint256(limitOrderParamsList[i].params.claimBounty) * 1 gwei;
}

if (address(this).balance > 0) {
(bool success, ) = payer.call{value: address(this).balance}("");
if (!success) {
revert Errors.CloberError(Errors.FAILED_TO_SEND_VALUE);
}
for (uint256 i = 0; i < limitOrderParamsList.length; ++i) {
nativeToRemain -= uint256(limitOrderParamsList[i].params.claimBounty) * 1 gwei;
orderIds[i] = _limitOrder(limitOrderParamsList[i].params, limitOrderParamsList[i].isBid, nativeToRemain);
}
}

function limitBid(LimitOrderParams calldata params)
external
payable
checkDeadline(params.deadline)
flushNative
returns (uint256)
{
return _limitOrder(params, _BID);
Expand All @@ -85,28 +111,37 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
external
payable
checkDeadline(params.deadline)
flushNative
returns (uint256)
{
return _limitOrder(params, _ASK);
}

function _limitOrder(LimitOrderParams calldata params, bool isBid) internal returns (uint256) {
return _limitOrder(params, isBid, 0);
}

function _limitOrder(
LimitOrderParams calldata params,
bool isBid,
uint256 nativeToRemain
) internal returns (uint256) {
return
CloberOrderBook(params.market).limitOrder{value: uint256(params.claimBounty) * 1 gwei}(
params.user,
params.priceIndex,
params.rawAmount,
params.baseAmount,
(isBid ? 1 : 0) + (params.postOnly ? 2 : 0),
abi.encode(msg.sender, params.useNative)
abi.encode(msg.sender, params.useNative, nativeToRemain)
);
}

function marketBid(MarketOrderParams calldata params) external payable checkDeadline(params.deadline) {
function marketBid(MarketOrderParams calldata params) external payable checkDeadline(params.deadline) flushNative {
_marketOrder(params, _BID);
}

function marketAsk(MarketOrderParams calldata params) external payable checkDeadline(params.deadline) {
function marketAsk(MarketOrderParams calldata params) external payable checkDeadline(params.deadline) flushNative {
_marketOrder(params, _ASK);
}

Expand All @@ -117,11 +152,15 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
params.rawAmount,
params.baseAmount,
(isBid ? 1 : 0) + (params.expendInput ? 2 : 0),
abi.encode(msg.sender, params.useNative)
abi.encode(msg.sender, params.useNative, 0)
);
}

function claim(uint64 deadline, ClaimOrderParams[] calldata paramsList) external checkDeadline(deadline) {
function claim(uint64 deadline, ClaimOrderParams[] calldata paramsList)
external
checkDeadline(deadline)
flushNative
{
_claim(paramsList);
}

Expand All @@ -136,6 +175,7 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
external
payable
checkDeadline(limitOrderParams.deadline)
flushNative
returns (uint256)
{
_claim(claimParamsList);
Expand All @@ -146,6 +186,7 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
external
payable
checkDeadline(limitOrderParams.deadline)
flushNative
returns (uint256)
{
_claim(claimParamsList);
Expand All @@ -155,15 +196,15 @@ contract MarketRouter is CloberMarketSwapCallbackReceiver, CloberRouter {
function marketBidAfterClaim(
ClaimOrderParams[] calldata claimParamsList,
MarketOrderParams calldata marketOrderParams
) external payable checkDeadline(marketOrderParams.deadline) {
) external payable checkDeadline(marketOrderParams.deadline) flushNative {
_claim(claimParamsList);
_marketOrder(marketOrderParams, _BID);
}

function marketAskAfterClaim(
ClaimOrderParams[] calldata claimParamsList,
MarketOrderParams calldata marketOrderParams
) external payable checkDeadline(marketOrderParams.deadline) {
) external payable checkDeadline(marketOrderParams.deadline) flushNative {
_claim(claimParamsList);
_marketOrder(marketOrderParams, _ASK);
}
Expand Down
21 changes: 21 additions & 0 deletions contracts/interfaces/CloberRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,27 @@ interface CloberRouter {
uint256 baseAmount;
}

/**
* @notice LimitOrderParams struct is a generalized version of LimitOrderParam to be used for both bids and asks.
* @param params This is the LimitOrderParams struct which contains all the necessary information of a limit order.
* @param isBid This flag, if set to true, means that the order is a bid. If false, the order is an ask.
*/
struct GeneralLimitOrderParams {
LimitOrderParams params;
bool isBid;
}

/**
* @notice Places limit orders.
* @param limitOrderParamsList The limit order parameters list.
* @param claimParamsList Array of ClaimOrderParams: The list of orders to be claimed.
* @return orderIds The order indices. If an order is not made `type(uint256).max` is returned instead.
*/
function limitOrder(
GeneralLimitOrderParams[] calldata limitOrderParamsList,
ClaimOrderParams[] calldata claimParamsList
) external payable returns (uint256[] memory orderIds);

/**
* @notice Places a limit order on the bid side.
* @param params The limit order parameters.
Expand Down

0 comments on commit 1bcaf60

Please sign in to comment.