Skip to content
This repository was archived by the owner on Jan 18, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 ============

Expand Down
21 changes: 7 additions & 14 deletions contracts/core/extensions/CoreIssuanceOrder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand All @@ -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)
);

Expand Down Expand Up @@ -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;
Expand Down
21 changes: 14 additions & 7 deletions contracts/core/lib/ExchangeHandler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 ============

Expand All @@ -45,21 +50,23 @@ library ExchangeHandler {
* @return ExchangeHeader Struct containing data for a batch of exchange orders
*/
function parseExchangeHeader(
bytes _headerData
bytes _headerData,
uint256 _offset
)
internal
pure
returns (ExchangeHeader memory)
{
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;
Expand Down