diff --git a/contracts/core/exchange-wrappers/lib/ZeroExOrderDataHandler.sol b/contracts/core/exchange-wrappers/lib/ZeroExOrderDataHandler.sol index bce56c3ca..fb54cc9e0 100644 --- a/contracts/core/exchange-wrappers/lib/ZeroExOrderDataHandler.sol +++ b/contracts/core/exchange-wrappers/lib/ZeroExOrderDataHandler.sol @@ -44,8 +44,8 @@ import { LibOrder } from "../../../external/0x/Exchange/libs/LibOrder.sol"; * | | order | 160+signatureLength | orderLength | ZeroEx Order | */ library ZeroExOrderDataHandler { - using SafeMath for uint256; using LibBytes for bytes; + using SafeMath for uint256; // ============ Constants ============ diff --git a/contracts/core/extensions/CoreIssuanceOrder.sol b/contracts/core/extensions/CoreIssuanceOrder.sol index a9213765a..77f455f3e 100644 --- a/contracts/core/extensions/CoreIssuanceOrder.sol +++ b/contracts/core/extensions/CoreIssuanceOrder.sol @@ -48,10 +48,6 @@ contract CoreIssuanceOrder is using SafeMath for uint256; using Math for uint256; - /* ============ Constants ============ */ - - uint256 constant EXCHANGE_HEADER_LENGTH = 160; - /* ============ Events ============ */ event LogFill( @@ -256,14 +252,11 @@ contract CoreIssuanceOrder is uint256 scannedBytes; uint256 makerTokenUsed; while (scannedBytes < _orderData.length) { - // Read and parse the next exchange order header - bytes memory headerData = LibBytes.slice( - _orderData, - scannedBytes, - scannedBytes.add(EXCHANGE_HEADER_LENGTH) - ); + + // Parse next exchange header based on scannedBytes ExchangeHandler.ExchangeHeader memory header = ExchangeHandler.parseExchangeHeader( - headerData + _orderData, + scannedBytes ); // Get exchange address from state mapping based on header exchange info @@ -273,10 +266,10 @@ contract CoreIssuanceOrder is require(exchange != address(0)); // Read the order body based on header order length info - uint256 exchangeDataLength = header.totalOrdersLength.add(EXCHANGE_HEADER_LENGTH); + uint256 exchangeDataLength = header.totalOrdersLength.add(160); bytes memory bodyData = LibBytes.slice( _orderData, - scannedBytes.add(EXCHANGE_HEADER_LENGTH), + scannedBytes.add(160), scannedBytes.add(exchangeDataLength) ); @@ -307,7 +300,7 @@ contract CoreIssuanceOrder is // Update scanned bytes with header and body lengths scannedBytes = scannedBytes.add(exchangeDataLength); - makerTokenUsed += header.makerTokenAmount; + makerTokenUsed = makerTokenUsed.add(header.makerTokenAmount); } return makerTokenUsed; diff --git a/contracts/core/lib/ExchangeHandler.sol b/contracts/core/lib/ExchangeHandler.sol index 8865487e5..521023a14 100644 --- a/contracts/core/lib/ExchangeHandler.sol +++ b/contracts/core/lib/ExchangeHandler.sol @@ -17,6 +17,9 @@ pragma solidity 0.4.24; pragma experimental "ABIEncoderV2"; +import { LibBytes } from "../../external/0x/LibBytes.sol"; +import { SafeMath } from "zeppelin-solidity/contracts/math/SafeMath.sol"; + /** * @title ExchangeHandler @@ -25,6 +28,8 @@ pragma experimental "ABIEncoderV2"; * This library contains functions and structs to assist with parsing exchange orders data */ library ExchangeHandler { + using LibBytes for bytes; + using SafeMath for uint256; // ============ Structs ============ @@ -45,7 +50,8 @@ library ExchangeHandler { * @return ExchangeHeader Struct containing data for a batch of exchange orders */ function parseExchangeHeader( - bytes _headerData + bytes _headerData, + uint256 _offset ) internal pure @@ -53,13 +59,14 @@ library ExchangeHandler { { ExchangeHeader memory header; - // Create ExchangeHeader struct + uint256 headerDataStart = _headerData.contentAddress().add(_offset); + assembly { - mstore(header, mload(add(_headerData, 32))) // exchange - mstore(add(header, 32), mload(add(_headerData, 64))) // orderCount - mstore(add(header, 64), mload(add(_headerData, 96))) // makerTokenAddress - mstore(add(header, 96), mload(add(_headerData, 128))) // makerTokenAmount - mstore(add(header, 128), mload(add(_headerData, 160))) // totalOrdersLength + mstore(header, mload(headerDataStart)) // exchange + mstore(add(header, 32), mload(add(headerDataStart, 32))) // orderCount + mstore(add(header, 64), mload(add(headerDataStart, 64))) // makerTokenAddress + mstore(add(header, 96), mload(add(headerDataStart, 96))) // makerTokenAmount + mstore(add(header, 128), mload(add(headerDataStart, 128))) // totalOrdersLength } return header;