aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Hysen <greg.hysen@gmail.com>2018-12-14 06:20:11 +0800
committerGreg Hysen <greg.hysen@gmail.com>2018-12-19 05:36:05 +0800
commitf3a2e3b6f3adb75d1920779df9dabb7cf476a996 (patch)
treef53e32f445842fedbf5bdc0dcac915c80869df38
parentf91781a0605f46ee1a40bf979d22ff510f48d464 (diff)
downloaddexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar.gz
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar.bz2
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar.lz
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar.xz
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.tar.zst
dexon-sol-tools-f3a2e3b6f3adb75d1920779df9dabb7cf476a996.zip
Moved exchange calldata functions to separate mixin
-rw-r--r--contracts/extensions/contracts/BalanceThresholdFilter/MixinBalanceThresholdFilterCore.sol93
-rw-r--r--contracts/utils/contracts/utils/ExchangeSelectors/ExchangeSelectors.sol151
2 files changed, 9 insertions, 235 deletions
diff --git a/contracts/extensions/contracts/BalanceThresholdFilter/MixinBalanceThresholdFilterCore.sol b/contracts/extensions/contracts/BalanceThresholdFilter/MixinBalanceThresholdFilterCore.sol
index e78f9ced8..8d15fe6c8 100644
--- a/contracts/extensions/contracts/BalanceThresholdFilter/MixinBalanceThresholdFilterCore.sol
+++ b/contracts/extensions/contracts/BalanceThresholdFilter/MixinBalanceThresholdFilterCore.sol
@@ -18,15 +18,17 @@
pragma solidity 0.4.24;
-import "./mixins/MBalanceThresholdFilterCore.sol";
-import "@0x/contracts-utils/contracts/utils/ExchangeSelectors/ExchangeSelectors.sol";
+import "@0x/contracts-libs/contracts/libs/LibExchangeSelectors.sol";
import "@0x/contracts-libs/contracts/libs/LibOrder.sol";
+import "./mixins/MBalanceThresholdFilterCore.sol";
+import "./MixinExchangeCalldata.sol";
contract MixinBalanceThresholdFilterCore is
MBalanceThresholdFilterCore,
+ MixinExchangeCalldata,
LibOrder,
- ExchangeSelectors
+ LibExchangeSelectors
{
/// @dev Executes an Exchange transaction iff the maker and taker meet
@@ -72,82 +74,7 @@ contract MixinBalanceThresholdFilterCore is
);
}
- /// @dev Emulates the `calldataload` opcode on the embedded Exchange calldata,
- /// which is accessed through `signedExchangeTransaction`.
- /// @param offset Offset into the Exchange calldata.
- /// @return value Corresponding 32 byte value stored at `offset`.
- function exchangeCalldataload(uint256 offset)
- internal
- returns (bytes32 value)
- {
- assembly {
- // Pointer to exchange transaction
- // 0x04 for calldata selector
- // 0x40 to access `signedExchangeTransaction`, which is the third parameter
- let exchangeTxPtr := calldataload(0x44)
-
- // Offset into Exchange calldata
- // We compute this by adding 0x24 to the `exchangeTxPtr` computed above.
- // 0x04 for calldata selector
- // 0x20 for length field of `signedExchangeTransaction`
- let exchangeCalldataOffset := add(exchangeTxPtr, add(0x24, offset))
- value := calldataload(exchangeCalldataOffset)
- }
- }
-
- /// @dev Convenience function that skips the 4 byte selector when loading
- /// from the embedded Exchange calldata.
- /// @param offset Offset into the Exchange calldata (minus the 4 byte selector)
- /// @return value Corresponding 32 byte value stored at `offset` + 4.
- function loadExchangeData(uint256 offset)
- internal
- returns (bytes32 value)
- {
- value = exchangeCalldataload(offset + 4);
- }
-
- /// @dev A running list is maintained of addresses to validate.
- /// This function records an address in this array.
- /// @param addressToValidate Address to record for validation.
- function recordAddressToValidate(address addressToValidate, address[] memory addressList)
- internal
- {
- uint256 newAddressListLength = addressList.length + 1;
- assembly {
- // Store new array length
- mstore(addressList, newAddressListLength)
- mstore(0x40, add(addressList, add(0x20, mul(0x20, newAddressListLength))))
- }
- addressList[newAddressListLength - 1] = addressToValidate;
- }
-
- /// @dev Extracts the maker address from an order stored in the Exchange calldata
- /// (which is embedded in `signedExchangeTransaction`), and records it in
- /// the running list of addresses to validate.
- /// @param orderParamIndex Index of the order in the Exchange function's signature
- function loadMakerAddressFromOrder(uint8 orderParamIndex) internal returns (address makerAddress) {
- uint256 orderPtr = uint256(loadExchangeData(orderParamIndex * 0x20));
- makerAddress = address(loadExchangeData(orderPtr));
- }
-
- /// @dev Extracts the maker addresses from an array of orders stored in the Exchange calldata
- /// (which is embedded in `signedExchangeTransaction`), and records them in
- /// the running list of addresses to validate.
- /// @param orderArrayParamIndex Index of the order array in the Exchange function's signature
- function loadMakerAddressesFromOrderArray(uint8 orderArrayParamIndex)
- internal
- returns (address[] makerAddresses)
- {
- uint256 orderArrayPtr = uint256(loadExchangeData(orderArrayParamIndex * 0x20));
- uint256 orderArrayLength = uint256(loadExchangeData(orderArrayPtr));
- uint256 orderArrayElementPtr = orderArrayPtr + 0x20;
- uint256 orderArrayElementEndPtr = orderArrayElementPtr + (orderArrayLength * 0x20);
- for(uint orderPtrOffset = orderArrayElementPtr; orderPtrOffset < orderArrayElementEndPtr; orderPtrOffset += 0x20) {
- uint256 orderPtr = uint256(loadExchangeData(orderPtrOffset));
- address makerAddress = address(loadExchangeData(orderPtr + orderArrayElementPtr));
- recordAddressToValidate(makerAddress, makerAddresses);
- }
- }
+
/// @dev Validates addresses meet the balance threshold specified by `BALANCE_THRESHOLD`
/// for the asset `THRESHOLD_ASSET`. If one address does not meet the thresold
@@ -188,12 +115,10 @@ contract MixinBalanceThresholdFilterCore is
recordAddressToValidate(rightOrderAddress, addressesToValidate);
recordAddressToValidate(signerAddress, addressesToValidate);
} else if(
- exchangeFunctionSelector == cancelOrderSelector ||
- exchangeFunctionSelector == batchCancelOrdersSelector ||
- exchangeFunctionSelector == cancelOrdersUpToSelector
+ exchangeFunctionSelector != cancelOrderSelector &&
+ exchangeFunctionSelector != batchCancelOrdersSelector &&
+ exchangeFunctionSelector != cancelOrdersUpToSelector
) {
- // Do nothing
- } else {
revert("INVALID_OR_BLOCKED_EXCHANGE_SELECTOR");
}
diff --git a/contracts/utils/contracts/utils/ExchangeSelectors/ExchangeSelectors.sol b/contracts/utils/contracts/utils/ExchangeSelectors/ExchangeSelectors.sol
deleted file mode 100644
index c361fd075..000000000
--- a/contracts/utils/contracts/utils/ExchangeSelectors/ExchangeSelectors.sol
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
-
- Copyright 2018 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity 0.4.24;
-
-
-contract ExchangeSelectors {
-
- // allowedValidators
- bytes4 constant allowedValidatorsSelector = 0x7b8e3514;
- bytes4 constant allowedValidatorsSelectorGenerator = bytes4(keccak256('allowedValidators(address,address)'));
-
- // assetProxies
- bytes4 constant assetProxiesSelector = 0x3fd3c997;
- bytes4 constant assetProxiesSelectorGenerator = bytes4(keccak256('assetProxies(bytes4)'));
-
- // batchCancelOrders
- bytes4 constant batchCancelOrdersSelector = 0x4ac14782;
- bytes4 constant batchCancelOrdersSelectorGenerator = bytes4(keccak256('batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])'));
-
- // batchFillOrKillOrders
- bytes4 constant batchFillOrKillOrdersSelector = 0x4d0ae546;
- bytes4 constant batchFillOrKillOrdersSelectorGenerator = bytes4(keccak256('batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])'));
-
- // batchFillOrders
- bytes4 constant batchFillOrdersSelector = 0x297bb70b;
- bytes4 constant batchFillOrdersSelectorGenerator = bytes4(keccak256('batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])'));
-
- // batchFillOrdersNoThrow
- bytes4 constant batchFillOrdersNoThrowSelector = 0x50dde190;
- bytes4 constant batchFillOrdersNoThrowSelectorGenerator = bytes4(keccak256('batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])'));
-
- // cancelOrder
- bytes4 constant cancelOrderSelector = 0xd46b02c3;
- bytes4 constant cancelOrderSelectorGenerator = bytes4(keccak256('cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))'));
-
- // cancelOrdersUpTo
- bytes4 constant cancelOrdersUpToSelector = 0x4f9559b1;
- bytes4 constant cancelOrdersUpToSelectorGenerator = bytes4(keccak256('cancelOrdersUpTo(uint256)'));
-
- // cancelled
- bytes4 constant cancelledSelector = 0x2ac12622;
- bytes4 constant cancelledSelectorGenerator = bytes4(keccak256('cancelled(bytes32)'));
-
- // currentContextAddress
- bytes4 constant currentContextAddressSelector = 0xeea086ba;
- bytes4 constant currentContextAddressSelectorGenerator = bytes4(keccak256('currentContextAddress()'));
-
- // executeTransaction
- bytes4 constant executeTransactionSelector = 0xbfc8bfce;
- bytes4 constant executeTransactionSelectorGenerator = bytes4(keccak256('executeTransaction(uint256,address,bytes,bytes)'));
-
- // fillOrKillOrder
- bytes4 constant fillOrKillOrderSelector = 0x64a3bc15;
- bytes4 constant fillOrKillOrderSelectorGenerator = bytes4(keccak256('fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)'));
-
- // fillOrder
- bytes4 constant fillOrderSelector = 0xb4be83d5;
- bytes4 constant fillOrderSelectorGenerator = bytes4(keccak256('fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)'));
-
- // fillOrderNoThrow
- bytes4 constant fillOrderNoThrowSelector = 0x3e228bae;
- bytes4 constant fillOrderNoThrowSelectorGenerator = bytes4(keccak256('fillOrderNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)'));
-
- // filled
- bytes4 constant filledSelector = 0x288cdc91;
- bytes4 constant filledSelectorGenerator = bytes4(keccak256('filled(bytes32)'));
-
- // getAssetProxy
- bytes4 constant getAssetProxySelector = 0x60704108;
- bytes4 constant getAssetProxySelectorGenerator = bytes4(keccak256('getAssetProxy(bytes4)'));
-
- // getOrderInfo
- bytes4 constant getOrderInfoSelector = 0xc75e0a81;
- bytes4 constant getOrderInfoSelectorGenerator = bytes4(keccak256('getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))'));
-
- // getOrdersInfo
- bytes4 constant getOrdersInfoSelector = 0x7e9d74dc;
- bytes4 constant getOrdersInfoSelectorGenerator = bytes4(keccak256('getOrdersInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])'));
-
- // isValidSignature
- bytes4 constant isValidSignatureSelector = 0x93634702;
- bytes4 constant isValidSignatureSelectorGenerator = bytes4(keccak256('isValidSignature(bytes32,address,bytes)'));
-
- // marketBuyOrders
- bytes4 constant marketBuyOrdersSelector = 0xe5fa431b;
- bytes4 constant marketBuyOrdersSelectorGenerator = bytes4(keccak256('marketBuyOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])'));
-
- // marketBuyOrdersNoThrow
- bytes4 constant marketBuyOrdersNoThrowSelector = 0xa3e20380;
- bytes4 constant marketBuyOrdersNoThrowSelectorGenerator = bytes4(keccak256('marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])'));
-
- // marketSellOrders
- bytes4 constant marketSellOrdersSelector = 0x7e1d9808;
- bytes4 constant marketSellOrdersSelectorGenerator = bytes4(keccak256('marketSellOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])'));
-
- // marketSellOrdersNoThrow
- bytes4 constant marketSellOrdersNoThrowSelector = 0xdd1c7d18;
- bytes4 constant marketSellOrdersNoThrowSelectorGenerator = bytes4(keccak256('marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])'));
-
- // matchOrders
- bytes4 constant matchOrdersSelector = 0x3c28d861;
- bytes4 constant matchOrdersSelectorGenerator = bytes4(keccak256('matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes,bytes)'));
-
- // orderEpoch
- bytes4 constant orderEpochSelector = 0xd9bfa73e;
- bytes4 constant orderEpochSelectorGenerator = bytes4(keccak256('orderEpoch(address,address)'));
-
- // owner
- bytes4 constant ownerSelector = 0x8da5cb5b;
- bytes4 constant ownerSelectorGenerator = bytes4(keccak256('owner()'));
-
- // preSign
- bytes4 constant preSignSelector = 0x3683ef8e;
- bytes4 constant preSignSelectorGenerator = bytes4(keccak256('preSign(bytes32,address,bytes)'));
-
- // preSigned
- bytes4 constant preSignedSelector = 0x82c174d0;
- bytes4 constant preSignedSelectorGenerator = bytes4(keccak256('preSigned(bytes32,address)'));
-
- // registerAssetProxy
- bytes4 constant registerAssetProxySelector = 0xc585bb93;
- bytes4 constant registerAssetProxySelectorGenerator = bytes4(keccak256('registerAssetProxy(address)'));
-
- // setSignatureValidatorApproval
- bytes4 constant setSignatureValidatorApprovalSelector = 0x77fcce68;
- bytes4 constant setSignatureValidatorApprovalSelectorGenerator = bytes4(keccak256('setSignatureValidatorApproval(address,bool)'));
-
- // transactions
- bytes4 constant transactionsSelector = 0x642f2eaf;
- bytes4 constant transactionsSelectorGenerator = bytes4(keccak256('transactions(bytes32)'));
-
- // transferOwnership
- bytes4 constant transferOwnershipSelector = 0xf2fde38b;
- bytes4 constant transferOwnershipSelectorGenerator = bytes4(keccak256('transferOwnership(address)'));
-} \ No newline at end of file