diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index 707bf5c..cb76937 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -56,7 +56,27 @@ contract Exchange is Ownable, ExchangeInterface { /// @param signature Signed order along with signature mode. /// @param maxFillAmount Maximum amount of the order to be filled. function trade(address[3] addresses, uint[4] values, bytes signature, uint maxFillAmount) external { - exchange.trade(OrderLibrary.createOrder(addresses, values), msg.sender, signature, maxFillAmount); + exchange.trade(OrderLibrary.createOrder(addresses, values), msg.sender, signature, maxFillAmount, true); + } + + function matchTrade(address[3][2] addresses, uint[4][2] values, bytes leftSignature, bytes rightSignature) + external + { + OrderLibrary.Order memory left = OrderLibrary.createOrder(addresses[0], values[0]); + OrderLibrary.Order memory right = OrderLibrary.createOrder(addresses[1], values[1]); + + require(left.maker != right.maker); + require(left.makerToken == right.takerToken); + require(left.takerToken == right.makerToken); + + bytes32 leftHash = left.hash(); + bytes32 rightHash = right.hash(); + + require(exchange.canTrade(left, leftSignature, leftHash)); + require(exchange.canTrade(right, rightSignature, rightHash)); + + exchange.trade(left, right.maker, leftSignature, exchange.availableAmount(right, rightHash), true); + exchange.trade(right, left.maker, rightSignature, exchange.availableAmount(left, leftHash), false); } /// @dev Cancels an order. diff --git a/contracts/Libraries/ExchangeLibrary.sol b/contracts/Libraries/ExchangeLibrary.sol index ac60775..8ba63f4 100644 --- a/contracts/Libraries/ExchangeLibrary.sol +++ b/contracts/Libraries/ExchangeLibrary.sol @@ -45,7 +45,8 @@ library ExchangeLibrary { OrderLibrary.Order memory order, address taker, bytes signature, - uint maxFillAmount + uint maxFillAmount, + bool chargeFees ) internal { @@ -63,7 +64,7 @@ library ExchangeLibrary { uint makeAmount = order.makerTokenAmount.mul(fillAmount).div(order.takerTokenAmount); uint tradeTakerFee = makeAmount.mul(self.takerFee).div(1 ether); - if (tradeTakerFee > 0) { + if (tradeTakerFee > 0 && chargeFees) { self.vault.transfer(order.makerToken, order.maker, self.feeAccount, tradeTakerFee); }