aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/MixinExchangeCore.sol222
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IExchangeCore.sol20
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/mixins/MExchangeCore.sol20
3 files changed, 131 insertions, 131 deletions
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/MixinExchangeCore.sol b/packages/contracts/src/contracts/current/protocol/Exchange/MixinExchangeCore.sol
index 7e9c4f8fa..29d03fdb8 100644
--- a/packages/contracts/src/contracts/current/protocol/Exchange/MixinExchangeCore.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/MixinExchangeCore.sol
@@ -144,65 +144,62 @@ contract MixinExchangeCore is
return updateCancelledState(order, orderInfo.orderStatus, orderInfo.orderHash);
}
- /// @dev Validates context for fillOrder. Succeeds or throws.
- /// @param order to be filled.
- /// @param orderStatus Status of order to be filled.
- /// @param orderHash Hash of order to be filled.
- /// @param takerAddress Address of order taker.
- /// @param orderFilledAmount Amount of order already filled.
- /// @param takerAssetFillAmount Desired amount of order to fill by taker.
- /// @param signature Proof that the orders was created by its maker.
- function assertValidFill(
- Order memory order,
- uint8 orderStatus,
- bytes32 orderHash,
- address takerAddress,
- uint256 orderFilledAmount,
- uint256 takerAssetFillAmount,
- bytes memory signature
- )
- internal
+ /// @dev Gets information about an order: status, hash, and amount filled.
+ /// @param order Order to gather information on.
+ /// @return OrderInfo Information about the order and its state.
+ /// See LibOrder.OrderInfo for a complete description.
+ function getOrderInfo(Order memory order)
+ public
+ view
+ returns (LibOrder.OrderInfo memory orderInfo)
{
- // Ensure order is valid
- // An order can only be filled if its status is FILLABLE;
- // however, only invalid statuses result in a throw.
- // See LibStatus for a complete description of order statuses.
- require(
- orderStatus != uint8(Status.ORDER_INVALID_MAKER_ASSET_AMOUNT),
- INVALID_ORDER_MAKER_ASSET_AMOUNT
- );
- require(
- orderStatus != uint8(Status.ORDER_INVALID_TAKER_ASSET_AMOUNT),
- INVALID_ORDER_TAKER_ASSET_AMOUNT
- );
+ // Compute the order hash
+ orderInfo.orderHash = getOrderHash(order);
- // Validate Maker signature (check only if first time seen)
- if (orderFilledAmount == 0) {
- require(
- isValidSignature(orderHash, order.makerAddress, signature),
- SIGNATURE_VALIDATION_FAILED
- );
+ // If order.makerAssetAmount is zero, we also reject the order.
+ // While the Exchange contract handles them correctly, they create
+ // edge cases in the supporting infrastructure because they have
+ // an 'infinite' price when computed by a simple division.
+ if (order.makerAssetAmount == 0) {
+ orderInfo.orderStatus = uint8(Status.ORDER_INVALID_MAKER_ASSET_AMOUNT);
+ return orderInfo;
}
- // Validate sender is allowed to fill this order
- if (order.senderAddress != address(0)) {
- require(
- order.senderAddress == msg.sender,
- INVALID_SENDER
- );
+ // If order.takerAssetAmount is zero, then the order will always
+ // be considered filled because 0 == takerAssetAmount == orderFilledAmount
+ // Instead of distinguishing between unfilled and filled zero taker
+ // amount orders, we choose not to support them.
+ if (order.takerAssetAmount == 0) {
+ orderInfo.orderStatus = uint8(Status.ORDER_INVALID_TAKER_ASSET_AMOUNT);
+ return orderInfo;
}
- // Validate taker is allowed to fill this order
- if (order.takerAddress != address(0)) {
- require(
- order.takerAddress == takerAddress,
- INVALID_CONTEXT
- );
+ // Validate order expiration
+ if (block.timestamp >= order.expirationTimeSeconds) {
+ orderInfo.orderStatus = uint8(Status.ORDER_EXPIRED);
+ return orderInfo;
}
- require(
- takerAssetFillAmount > 0,
- GT_ZERO_AMOUNT_REQUIRED
- );
+
+ // Check if order has been cancelled
+ if (cancelled[orderInfo.orderHash]) {
+ orderInfo.orderStatus = uint8(Status.ORDER_CANCELLED);
+ return orderInfo;
+ }
+ if (makerEpoch[order.makerAddress] > order.salt) {
+ orderInfo.orderStatus = uint8(Status.ORDER_CANCELLED);
+ return orderInfo;
+ }
+
+ // Fetch filled amount and validate order availability
+ orderInfo.orderFilledAmount = filled[orderInfo.orderHash];
+ if (orderInfo.orderFilledAmount >= order.takerAssetAmount) {
+ orderInfo.orderStatus = uint8(Status.ORDER_FULLY_FILLED);
+ return orderInfo;
+ }
+
+ // All other statuses are ruled out: order is Fillable
+ orderInfo.orderStatus = uint8(Status.ORDER_FILLABLE);
+ return orderInfo;
}
/// @dev Calculates amounts filled and fees paid by maker and taker.
@@ -218,7 +215,7 @@ contract MixinExchangeCore is
uint256 orderFilledAmount,
uint256 takerAssetFillAmount
)
- internal
+ public
pure
returns (
uint8 status,
@@ -275,6 +272,67 @@ contract MixinExchangeCore is
return (status, fillResults);
}
+ /// @dev Validates context for fillOrder. Succeeds or throws.
+ /// @param order to be filled.
+ /// @param orderStatus Status of order to be filled.
+ /// @param orderHash Hash of order to be filled.
+ /// @param takerAddress Address of order taker.
+ /// @param orderFilledAmount Amount of order already filled.
+ /// @param takerAssetFillAmount Desired amount of order to fill by taker.
+ /// @param signature Proof that the orders was created by its maker.
+ function assertValidFill(
+ Order memory order,
+ uint8 orderStatus,
+ bytes32 orderHash,
+ address takerAddress,
+ uint256 orderFilledAmount,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ internal
+ {
+ // Ensure order is valid
+ // An order can only be filled if its status is FILLABLE;
+ // however, only invalid statuses result in a throw.
+ // See LibStatus for a complete description of order statuses.
+ require(
+ orderStatus != uint8(Status.ORDER_INVALID_MAKER_ASSET_AMOUNT),
+ INVALID_ORDER_MAKER_ASSET_AMOUNT
+ );
+ require(
+ orderStatus != uint8(Status.ORDER_INVALID_TAKER_ASSET_AMOUNT),
+ INVALID_ORDER_TAKER_ASSET_AMOUNT
+ );
+
+ // Validate Maker signature (check only if first time seen)
+ if (orderFilledAmount == 0) {
+ require(
+ isValidSignature(orderHash, order.makerAddress, signature),
+ SIGNATURE_VALIDATION_FAILED
+ );
+ }
+
+ // Validate sender is allowed to fill this order
+ if (order.senderAddress != address(0)) {
+ require(
+ order.senderAddress == msg.sender,
+ INVALID_SENDER
+ );
+ }
+
+ // Validate taker is allowed to fill this order
+ if (order.takerAddress != address(0)) {
+ require(
+ order.takerAddress == takerAddress,
+ INVALID_CONTEXT
+ );
+ }
+ require(
+ takerAssetFillAmount > 0,
+ GT_ZERO_AMOUNT_REQUIRED
+ );
+ }
+
/// @dev Updates state with results of a fill order.
/// @param order that was filled.
/// @param takerAddress Address of taker who filled the order.
@@ -385,62 +443,4 @@ contract MixinExchangeCore is
return stateUpdated;
}
-
- /// @dev Gets information about an order: status, hash, and amount filled.
- /// @param order Order to gather information on.
- /// @return OrderInfo Information about the order and its state.
- /// See LibOrder.OrderInfo for a complete description.
- function getOrderInfo(Order memory order)
- public
- view
- returns (LibOrder.OrderInfo memory orderInfo)
- {
- // Compute the order hash
- orderInfo.orderHash = getOrderHash(order);
-
- // If order.makerAssetAmount is zero, we also reject the order.
- // While the Exchange contract handles them correctly, they create
- // edge cases in the supporting infrastructure because they have
- // an 'infinite' price when computed by a simple division.
- if (order.makerAssetAmount == 0) {
- orderInfo.orderStatus = uint8(Status.ORDER_INVALID_MAKER_ASSET_AMOUNT);
- return orderInfo;
- }
-
- // If order.takerAssetAmount is zero, then the order will always
- // be considered filled because 0 == takerAssetAmount == orderFilledAmount
- // Instead of distinguishing between unfilled and filled zero taker
- // amount orders, we choose not to support them.
- if (order.takerAssetAmount == 0) {
- orderInfo.orderStatus = uint8(Status.ORDER_INVALID_TAKER_ASSET_AMOUNT);
- return orderInfo;
- }
-
- // Validate order expiration
- if (block.timestamp >= order.expirationTimeSeconds) {
- orderInfo.orderStatus = uint8(Status.ORDER_EXPIRED);
- return orderInfo;
- }
-
- // Check if order has been cancelled
- if (cancelled[orderInfo.orderHash]) {
- orderInfo.orderStatus = uint8(Status.ORDER_CANCELLED);
- return orderInfo;
- }
- if (makerEpoch[order.makerAddress] > order.salt) {
- orderInfo.orderStatus = uint8(Status.ORDER_CANCELLED);
- return orderInfo;
- }
-
- // Fetch filled amount and validate order availability
- orderInfo.orderFilledAmount = filled[orderInfo.orderHash];
- if (orderInfo.orderFilledAmount >= order.takerAssetAmount) {
- orderInfo.orderStatus = uint8(Status.ORDER_FULLY_FILLED);
- return orderInfo;
- }
-
- // All other statuses are ruled out: order is Fillable
- orderInfo.orderStatus = uint8(Status.ORDER_FILLABLE);
- return orderInfo;
- }
}
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IExchangeCore.sol b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IExchangeCore.sol
index 958a89c39..8a0a73556 100644
--- a/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IExchangeCore.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/interfaces/IExchangeCore.sol
@@ -57,4 +57,24 @@ contract IExchangeCore {
public
view
returns (LibOrder.OrderInfo memory orderInfo);
+
+ /// @dev Calculates amounts filled and fees paid by maker and taker.
+ /// @param order to be filled.
+ /// @param orderStatus Status of order to be filled.
+ /// @param orderFilledAmount Amount of order already filled.
+ /// @param takerAssetFillAmount Desired amount of order to fill by taker.
+ /// @return status Return status of calculating fill amounts. Returns Status.SUCCESS on success.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function calculateFillResults(
+ LibOrder.Order memory order,
+ uint8 orderStatus,
+ uint256 orderFilledAmount,
+ uint256 takerAssetFillAmount
+ )
+ public
+ pure
+ returns (
+ uint8 status,
+ LibFillResults.FillResults memory fillResults
+ );
}
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MExchangeCore.sol b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MExchangeCore.sol
index fe6c155a3..2f928372b 100644
--- a/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MExchangeCore.sol
+++ b/packages/contracts/src/contracts/current/protocol/Exchange/mixins/MExchangeCore.sol
@@ -75,26 +75,6 @@ contract MExchangeCore is
)
internal;
- /// @dev Calculates amounts filled and fees paid by maker and taker.
- /// @param order to be filled.
- /// @param orderStatus Status of order to be filled.
- /// @param orderFilledAmount Amount of order already filled.
- /// @param takerAssetFillAmount Desired amount of order to fill by taker.
- /// @return status Return status of calculating fill amounts. Returns Status.SUCCESS on success.
- /// @return fillResults Amounts filled and fees paid by maker and taker.
- function calculateFillResults(
- LibOrder.Order memory order,
- uint8 orderStatus,
- uint256 orderFilledAmount,
- uint256 takerAssetFillAmount
- )
- internal
- pure
- returns (
- uint8 status,
- LibFillResults.FillResults memory fillResults
- );
-
/// @dev Updates state with results of a fill order.
/// @param order that was filled.
/// @param takerAddress Address of taker who filled the order.