Remove LibExchangeSelectors.sol

This commit is contained in:
Amir Bandeali
2019-07-09 20:12:20 -07:00
parent 2251e5e418
commit 7d5276ad11
8 changed files with 60 additions and 68 deletions

View File

@@ -19,11 +19,11 @@
pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol";
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
import "@0x/contracts-utils/contracts/src/LibAddressArray.sol";
import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol";
import "./libs/LibCoordinatorApproval.sol";
import "./interfaces/ISignatureValidator.sol";
import "./interfaces/ICoordinatorApprovalVerifier.sol";
@@ -31,7 +31,6 @@ import "./interfaces/ICoordinatorApprovalVerifier.sol";
// solhint-disable avoid-tx-origin
contract MixinCoordinatorApprovalVerifier is
LibExchangeSelectors,
LibCoordinatorApproval,
LibZeroExTransaction,
ISignatureValidator,
@@ -84,9 +83,9 @@ contract MixinCoordinatorApprovalVerifier is
{
bytes4 selector = data.readBytes4(0);
if (
selector == FILL_ORDER_SELECTOR ||
selector == FILL_ORDER_NO_THROW_SELECTOR ||
selector == FILL_OR_KILL_ORDER_SELECTOR
selector == IExchange(address(0)).fillOrder.selector ||
selector == IExchange(address(0)).fillOrderNoThrow.selector ||
selector == IExchange(address(0)).fillOrKillOrder.selector
) {
// Decode single order
(LibOrder.Order memory order) = abi.decode(
@@ -96,11 +95,11 @@ contract MixinCoordinatorApprovalVerifier is
orders = new LibOrder.Order[](1);
orders[0] = order;
} else if (
selector == BATCH_FILL_ORDERS_SELECTOR ||
selector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR ||
selector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR ||
selector == MARKET_BUY_ORDERS_SELECTOR ||
selector == MARKET_SELL_ORDERS_SELECTOR
selector == IExchange(address(0)).batchFillOrders.selector ||
selector == IExchange(address(0)).batchFillOrdersNoThrow.selector ||
selector == IExchange(address(0)).batchFillOrKillOrders.selector ||
selector == IExchange(address(0)).marketBuyOrders.selector ||
selector == IExchange(address(0)).marketSellOrders.selector
) {
// Decode all orders
// solhint-disable indent
@@ -108,7 +107,7 @@ contract MixinCoordinatorApprovalVerifier is
data.slice(4, data.length),
(LibOrder.Order[])
);
} else if (selector == MATCH_ORDERS_SELECTOR) {
} else if (selector == IExchange(address(0)).matchOrders.selector) {
// Decode left and right orders
(LibOrder.Order memory leftOrder, LibOrder.Order memory rightOrder) = abi.decode(
data.slice(4, data.length),

View File

@@ -19,14 +19,13 @@
pragma solidity ^0.5.5;
pragma experimental ABIEncoderV2;
import "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol";
import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol";
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
contract LibTransactionDecoder is
LibExchangeSelectors
{
contract LibTransactionDecoder {
using LibBytes for bytes;
/// @dev Decodes the call data for an Exchange contract method call.
@@ -47,66 +46,65 @@ contract LibTransactionDecoder is
{
bytes4 functionSelector = transactionData.readBytes4(0);
if (functionSelector == BATCH_CANCEL_ORDERS_SELECTOR) {
if (functionSelector == IExchange(address(0)).batchCancelOrders.selector) {
functionName = "batchCancelOrders";
} else if (functionSelector == BATCH_FILL_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).batchFillOrders.selector) {
functionName = "batchFillOrders";
} else if (functionSelector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).batchFillOrdersNoThrow.selector) {
functionName = "batchFillOrdersNoThrow";
} else if (functionSelector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).batchFillOrKillOrders.selector) {
functionName = "batchFillOrKillOrders";
} else if (functionSelector == CANCEL_ORDER_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).cancelOrder.selector) {
functionName = "cancelOrder";
} else if (functionSelector == FILL_ORDER_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).fillOrder.selector) {
functionName = "fillOrder";
} else if (functionSelector == FILL_ORDER_NO_THROW_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).fillOrderNoThrow.selector) {
functionName = "fillOrderNoThrow";
} else if (functionSelector == FILL_OR_KILL_ORDER_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).fillOrKillOrder.selector) {
functionName = "fillOrKillOrder";
} else if (functionSelector == MARKET_BUY_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).marketBuyOrders.selector) {
functionName = "marketBuyOrders";
} else if (functionSelector == MARKET_SELL_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).marketSellOrders.selector) {
functionName = "marketSellOrders";
} else if (functionSelector == MATCH_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).matchOrders.selector) {
functionName = "matchOrders";
} else if (
functionSelector == CANCEL_ORDERS_UP_TO_SELECTOR ||
functionSelector == EXECUTE_TRANSACTION_SELECTOR
// TODO: add new noThrow cancel functions when https://github.com/0xProject/ZEIPs/issues/35 is merged.
functionSelector == IExchange(address(0)).cancelOrdersUpTo.selector ||
functionSelector == IExchange(address(0)).executeTransaction.selector
) {
revert("UNIMPLEMENTED");
} else {
revert("UNKNOWN_FUNCTION_SELECTOR");
}
if (functionSelector == BATCH_CANCEL_ORDERS_SELECTOR) {
if (functionSelector == IExchange(address(0)).batchCancelOrders.selector) {
// solhint-disable-next-line indent
orders = abi.decode(transactionData.slice(4, transactionData.length), (LibOrder.Order[]));
takerAssetFillAmounts = new uint256[](0);
signatures = new bytes[](0);
} else if (
functionSelector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR ||
functionSelector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR ||
functionSelector == BATCH_FILL_ORDERS_SELECTOR
functionSelector == IExchange(address(0)).batchFillOrKillOrders.selector ||
functionSelector == IExchange(address(0)).batchFillOrdersNoThrow.selector ||
functionSelector == IExchange(address(0)).batchFillOrders.selector
) {
(orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForBatchFill(transactionData);
} else if (functionSelector == CANCEL_ORDER_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).cancelOrder.selector) {
orders = new LibOrder.Order[](1);
orders[0] = abi.decode(transactionData.slice(4, transactionData.length), (LibOrder.Order));
takerAssetFillAmounts = new uint256[](0);
signatures = new bytes[](0);
} else if (
functionSelector == FILL_OR_KILL_ORDER_SELECTOR ||
functionSelector == FILL_ORDER_SELECTOR ||
functionSelector == FILL_ORDER_NO_THROW_SELECTOR
functionSelector == IExchange(address(0)).fillOrKillOrder.selector ||
functionSelector == IExchange(address(0)).fillOrder.selector ||
functionSelector == IExchange(address(0)).fillOrderNoThrow.selector
) {
(orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForSingleOrderFill(transactionData);
} else if (
functionSelector == MARKET_BUY_ORDERS_SELECTOR ||
functionSelector == MARKET_SELL_ORDERS_SELECTOR
functionSelector == IExchange(address(0)).marketBuyOrders.selector ||
functionSelector == IExchange(address(0)).marketSellOrders.selector
) {
(orders, takerAssetFillAmounts, signatures) = _makeReturnValuesForMarketFill(transactionData);
} else if (functionSelector == MATCH_ORDERS_SELECTOR) {
} else if (functionSelector == IExchange(address(0)).matchOrders.selector) {
(
LibOrder.Order memory leftOrder,
LibOrder.Order memory rightOrder,

View File

@@ -23,14 +23,12 @@ import "./libs/LibConstants.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibOrder.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibFillResults.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibMath.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol";
import "@0x/contracts/exchange/contracts/src/interfaces/IExchange.sol";
contract MixinExchangeWrapper is
LibFillResults,
LibMath,
LibConstants,
LibExchangeSelectors
LibConstants
{
/// @dev Fills the input order.
/// Returns false if the transaction would otherwise revert.
@@ -48,9 +46,7 @@ contract MixinExchangeWrapper is
{
// ABI encode calldata for `fillOrder`
bytes memory fillOrderCalldata = abi.encodeWithSelector(
// bytes4(keccak256("fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),uint256,bytes)"))
// = 0x9b44d556
0x9b44d556,
IExchange(address(0)).fillOrder.selector,
order,
takerAssetFillAmount,
signature

View File

@@ -32,7 +32,6 @@ import "./MixinSignatureValidator.sol";
contract MixinExchangeCore is
IExchangeCore,
IExchangeRichErrors,
LibMath,
LibFillResults,
MixinAssetProxyDispatcher,

View File

@@ -72,7 +72,7 @@ contract MixinWrapperFunctions is
{
// ABI encode calldata for `fillOrder`
bytes memory fillOrderCalldata = abi.encodeWithSelector(
IExchangeCore(0).fillOrder.selector,
IExchangeCore(address(0)).fillOrder.selector,
order,
takerAssetFillAmount,
signature

View File

@@ -216,13 +216,14 @@ blockchainTests.resets('Exchange wrappers', env => {
signedOrder.signature,
{ from: takerAddress },
);
await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress, {
const txReceipt = await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress, {
takerAssetFillAmount,
// HACK(albrow): We need to hardcode the gas estimate here because
// the Geth gas estimator doesn't work with the way we use
// delegatecall and swallow errors.
gas: 250000,
});
console.log(txReceipt.gasUsed);
const newBalances = await erc20Wrapper.getBalancesAsync();
const makerAssetFilledAmount = takerAssetFillAmount

View File

@@ -19,16 +19,15 @@
pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "@0x/contracts-exchange-libs/contracts/src/LibExchangeSelectors.sol";
import "@0x/contracts-exchange-libs/contracts/src/LibZeroExTransaction.sol";
import "@0x/contracts-exchange/contracts/src/interfaces/IExchange.sol";
import "./MixinExchangeCalldata.sol";
import "./interfaces/IBalanceThresholdFilterCore.sol";
contract MixinBalanceThresholdFilterCore is
IBalanceThresholdFilterCore,
MixinExchangeCalldata,
LibExchangeSelectors
MixinExchangeCalldata
{
/// @dev Executes an Exchange transaction iff the maker and taker meet
@@ -100,34 +99,34 @@ contract MixinBalanceThresholdFilterCore is
bytes4 exchangeFunctionSelector = bytes4(_exchangeCalldataload(0));
// solhint-disable expression-indent
if (
exchangeFunctionSelector == BATCH_FILL_ORDERS_SELECTOR ||
exchangeFunctionSelector == BATCH_FILL_ORDERS_NO_THROW_SELECTOR ||
exchangeFunctionSelector == BATCH_FILL_OR_KILL_ORDERS_SELECTOR ||
exchangeFunctionSelector == MARKET_BUY_ORDERS_SELECTOR ||
exchangeFunctionSelector == MARKET_BUY_ORDERS_NO_THROW_SELECTOR ||
exchangeFunctionSelector == MARKET_SELL_ORDERS_SELECTOR ||
exchangeFunctionSelector == MARKET_SELL_ORDERS_NO_THROW_SELECTOR
exchangeFunctionSelector == IExchange(address(0)).batchFillOrders.selector ||
exchangeFunctionSelector == IExchange(address(0)).batchFillOrdersNoThrow.selector ||
exchangeFunctionSelector == IExchange(address(0)).batchFillOrKillOrders.selector ||
exchangeFunctionSelector == IExchange(address(0)).marketBuyOrders.selector ||
exchangeFunctionSelector == IExchange(address(0)).marketBuyOrdersNoThrow.selector ||
exchangeFunctionSelector == IExchange(address(0)).marketSellOrders.selector ||
exchangeFunctionSelector == IExchange(address(0)).marketSellOrdersNoThrow.selector
) {
addressesToValidate = _loadMakerAddressesFromOrderArray(0);
addressesToValidate = addressesToValidate.append(signerAddress);
} else if (
exchangeFunctionSelector == FILL_ORDER_SELECTOR ||
exchangeFunctionSelector == FILL_ORDER_NO_THROW_SELECTOR ||
exchangeFunctionSelector == FILL_OR_KILL_ORDER_SELECTOR
exchangeFunctionSelector == IExchange(address(0)).fillOrder.selector ||
exchangeFunctionSelector == IExchange(address(0)).fillOrderNoThrow.selector ||
exchangeFunctionSelector == IExchange(address(0)).fillOrKillOrder.selector
) {
address makerAddress = _loadMakerAddressFromOrder(0);
addressesToValidate = addressesToValidate.append(makerAddress);
addressesToValidate = addressesToValidate.append(signerAddress);
} else if (exchangeFunctionSelector == MATCH_ORDERS_SELECTOR) {
} else if (exchangeFunctionSelector == IExchange(address(0)).matchOrders.selector) {
address leftMakerAddress = _loadMakerAddressFromOrder(0);
addressesToValidate = addressesToValidate.append(leftMakerAddress);
address rightMakerAddress = _loadMakerAddressFromOrder(1);
addressesToValidate = addressesToValidate.append(rightMakerAddress);
addressesToValidate = addressesToValidate.append(signerAddress);
} else if (
exchangeFunctionSelector != CANCEL_ORDER_SELECTOR &&
exchangeFunctionSelector != BATCH_CANCEL_ORDERS_SELECTOR &&
exchangeFunctionSelector != CANCEL_ORDERS_UP_TO_SELECTOR
exchangeFunctionSelector != IExchange(address(0)).cancelOrder.selector &&
exchangeFunctionSelector != IExchange(address(0)).batchCancelOrders.selector &&
exchangeFunctionSelector != IExchange(address(0)).cancelOrdersUpTo.selector
) {
revert("INVALID_OR_BLOCKED_EXCHANGE_SELECTOR");
}