Skip to content

Instantly share code, notes, and snippets.

@dave4506
Created June 4, 2019 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dave4506/6c4d3c229cde9a9844fe7a8f899decf6 to your computer and use it in GitHub Desktop.
Save dave4506/6c4d3c229cde9a9844fe7a8f899decf6 to your computer and use it in GitHub Desktop.
Dydx's parseOrders functionality to take bytes and convert back to 0x signed orders
function parseOrders(
bytes memory orderData,
address makerToken,
address takerToken
)
private
pure
returns (Order[] memory)
{
uint256 numOrders = parseNumOrders(orderData);
Order[] memory orders = new Order[](numOrders);
bytes memory makerAssetData = tokenAddressToAssetData(makerToken);
bytes memory takerAssetData = tokenAddressToAssetData(takerToken);
for (uint256 i = 0; i < numOrders; i++) {
// store pointer to order memory
Order memory order = orders[i];
order.makerFee = 0;
order.takerFee = 0;
order.makerAssetData = makerAssetData;
order.takerAssetData = takerAssetData;
uint256 dataOffset = getOrderDataOffset(i);
/* solium-disable-next-line security/no-inline-assembly */
assembly {
mstore(order, mload(add(add(orderData, 32), dataOffset))) // makerAddress
mstore(add(order, 32), mload(add(add(orderData, 64), dataOffset))) // takerAddress
mstore(add(order, 64), mload(add(add(orderData, 96), dataOffset))) // feeRecipientAddress
mstore(add(order, 96), mload(add(add(orderData, 128), dataOffset))) // senderAddress
mstore(add(order, 128), mload(add(add(orderData, 160), dataOffset))) // makerAssetAmount
mstore(add(order, 160), mload(add(add(orderData, 192), dataOffset))) // takerAssetAmount
mstore(add(order, 256), mload(add(add(orderData, 224), dataOffset))) // expirationTimeSeconds
mstore(add(order, 288), mload(add(add(orderData, 256), dataOffset))) // salt
}
}
return orders;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment