From 5bb3efc934f8810c2cd9408f31507140e713ba6a Mon Sep 17 00:00:00 2001 From: decanus Date: Wed, 25 Apr 2018 21:31:46 +0200 Subject: [PATCH 1/4] added match trade function --- contracts/Exchange.sol | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index ee833c5..fbe5690 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -72,6 +72,25 @@ contract Exchange is Ownable, ExchangeInterface { ); } + /// @todo ABIEncoderV2 this wont work with the signature stuff + function matchTrade(address[3][2] addresses, uint[4][2] values, bytes[2] signature) 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); + + bytes32 leftHash = left.hash(); + bytes32 rightHash = right.hash(); + + require(canTrade(left, signature[0], leftHash)); + require(canTrade(right, signature[1], rightHash)); + + // @todo events and that + performTrade(left, availableAmount(right, signature[1]), leftHash); + performTrade(right, availableAmount(left, signature[0]), rightHash); + } + /// @dev Cancels an order. /// @param addresses Array of trade's maker, makerToken and takerToken. /// @param values Array of trade's makerTokenAmount, takerTokenAmount, expires and nonce. From 09f81760d5c622ed08a08faddef0458f7b73cbd1 Mon Sep 17 00:00:00 2001 From: decanus Date: Thu, 26 Apr 2018 19:10:57 +0200 Subject: [PATCH 2/4] Updated --- contracts/Exchange.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index fbe5690..ae660e9 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -1,4 +1,5 @@ pragma solidity ^0.4.21; +pragma experimental ABIEncoderV2; import "./ExchangeInterface.sol"; import "./Libraries/SafeMath.sol"; @@ -72,23 +73,21 @@ contract Exchange is Ownable, ExchangeInterface { ); } - /// @todo ABIEncoderV2 this wont work with the signature stuff - function matchTrade(address[3][2] addresses, uint[4][2] values, bytes[2] signature) external { - OrderLibrary.Order memory left = OrderLibrary.createOrder(addresses[0], values[0]); - OrderLibrary.Order memory right = OrderLibrary.createOrder(addresses[1], values[1]); - + function matchTrade(OrderLibrary.Order left, OrderLibrary.Order right, bytes leftSignature, bytes rightSignature) + external + { require(left.maker != right.maker); require(left.makerToken == right.takerToken); bytes32 leftHash = left.hash(); bytes32 rightHash = right.hash(); - require(canTrade(left, signature[0], leftHash)); - require(canTrade(right, signature[1], rightHash)); + require(canTrade(left, leftSignature, leftHash)); + require(canTrade(right, rightSignature, rightHash)); // @todo events and that - performTrade(left, availableAmount(right, signature[1]), leftHash); - performTrade(right, availableAmount(left, signature[0]), rightHash); + performTrade(left, availableAmount(right, rightHash), leftHash); + performTrade(right, availableAmount(left, leftHash), rightHash); } /// @dev Cancels an order. From 639ab2a538221930e2d49cb4ddfb60d9a0ca0ae3 Mon Sep 17 00:00:00 2001 From: decanus Date: Wed, 2 May 2018 10:29:17 +0200 Subject: [PATCH 3/4] updated --- contracts/Exchange.sol | 17 +++++++++-------- contracts/Libraries/ExchangeLibrary.sol | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index c119219..c379e76 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -1,5 +1,4 @@ pragma solidity ^0.4.21; -pragma experimental ABIEncoderV2; import "./ExchangeInterface.sol"; import "./Libraries/OrderLibrary.sol"; @@ -57,24 +56,26 @@ 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(OrderLibrary.Order left, OrderLibrary.Order right, bytes leftSignature, bytes rightSignature) + 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); bytes32 leftHash = left.hash(); bytes32 rightHash = right.hash(); - require(canTrade(left, leftSignature, leftHash)); - require(canTrade(right, rightSignature, rightHash)); + require(exchange.canTrade(left, leftSignature, leftHash)); + require(exchange.canTrade(right, rightSignature, rightHash)); - // @todo events and that - performTrade(left, availableAmount(right, rightHash), leftHash); - performTrade(right, availableAmount(left, leftHash), 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 3e3a6e1..cd56af5 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); } From ea3940f04e053dd3aa02c0da57e83022796203a3 Mon Sep 17 00:00:00 2001 From: decanus Date: Wed, 2 May 2018 10:31:13 +0200 Subject: [PATCH 4/4] added token check --- contracts/Exchange.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/Exchange.sol b/contracts/Exchange.sol index c379e76..cb76937 100644 --- a/contracts/Exchange.sol +++ b/contracts/Exchange.sol @@ -67,6 +67,7 @@ contract Exchange is Ownable, ExchangeInterface { require(left.maker != right.maker); require(left.makerToken == right.takerToken); + require(left.takerToken == right.makerToken); bytes32 leftHash = left.hash(); bytes32 rightHash = right.hash();