{
    "schemaVersion": "2.0.0",
    "contractName": "Exchange",
    "compilerOutput": {
        "abi": [
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "bytes32" }],
                "name": "filled",
                "outputs": [{ "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrders",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "bytes32" }],
                "name": "cancelled",
                "outputs": [{ "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "name": "hash", "type": "bytes32" },
                    { "name": "signerAddress", "type": "address" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "preSign",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "leftOrder",
                        "type": "tuple"
                    },
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "rightOrder",
                        "type": "tuple"
                    },
                    { "name": "leftSignature", "type": "bytes" },
                    { "name": "rightSignature", "type": "bytes" }
                ],
                "name": "matchOrders",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    { "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "name": "makerFeePaid", "type": "uint256" },
                                    { "name": "takerFeePaid", "type": "uint256" }
                                ],
                                "name": "left",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    { "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "name": "makerFeePaid", "type": "uint256" },
                                    { "name": "takerFeePaid", "type": "uint256" }
                                ],
                                "name": "right",
                                "type": "tuple"
                            },
                            { "name": "leftMakerAssetSpreadAmount", "type": "uint256" }
                        ],
                        "name": "matchedFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "order",
                        "type": "tuple"
                    },
                    { "name": "takerAssetFillAmount", "type": "uint256" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "fillOrderNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "bytes4" }],
                "name": "assetProxies",
                "outputs": [{ "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    }
                ],
                "name": "batchCancelOrders",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrKillOrders",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "name": "targetOrderEpoch", "type": "uint256" }],
                "name": "cancelOrdersUpTo",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "assetProxyId", "type": "bytes4" }],
                "name": "getAssetProxy",
                "outputs": [{ "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "bytes32" }],
                "name": "transactions",
                "outputs": [{ "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "order",
                        "type": "tuple"
                    },
                    { "name": "takerAssetFillAmount", "type": "uint256" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "fillOrKillOrder",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "name": "validatorAddress", "type": "address" }, { "name": "approval", "type": "bool" }],
                "name": "setSignatureValidatorApproval",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "address" }, { "name": "", "type": "address" }],
                "name": "allowedValidators",
                "outputs": [{ "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "takerAssetFillAmount", "type": "uint256" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketSellOrders",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    }
                ],
                "name": "getOrdersInfo",
                "outputs": [
                    {
                        "components": [
                            { "name": "orderStatus", "type": "uint8" },
                            { "name": "orderHash", "type": "bytes32" },
                            { "name": "orderTakerAssetFilledAmount", "type": "uint256" }
                        ],
                        "name": "",
                        "type": "tuple[]"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "bytes32" }, { "name": "", "type": "address" }],
                "name": "preSigned",
                "outputs": [{ "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "owner",
                "outputs": [{ "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "name": "hash", "type": "bytes32" },
                    { "name": "signerAddress", "type": "address" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "isValidSignature",
                "outputs": [{ "name": "isValid", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "makerAssetFillAmount", "type": "uint256" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketBuyOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "order",
                        "type": "tuple"
                    },
                    { "name": "takerAssetFillAmount", "type": "uint256" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "fillOrder",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "name": "salt", "type": "uint256" },
                    { "name": "signerAddress", "type": "address" },
                    { "name": "data", "type": "bytes" },
                    { "name": "signature", "type": "bytes" }
                ],
                "name": "executeTransaction",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "name": "assetProxy", "type": "address" }],
                "name": "registerAssetProxy",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "order",
                        "type": "tuple"
                    }
                ],
                "name": "getOrderInfo",
                "outputs": [
                    {
                        "components": [
                            { "name": "orderStatus", "type": "uint8" },
                            { "name": "orderHash", "type": "bytes32" },
                            { "name": "orderTakerAssetFilledAmount", "type": "uint256" }
                        ],
                        "name": "orderInfo",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "order",
                        "type": "tuple"
                    }
                ],
                "name": "cancelOrder",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "name": "", "type": "address" }, { "name": "", "type": "address" }],
                "name": "orderEpoch",
                "outputs": [{ "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "ZRX_ASSET_DATA",
                "outputs": [{ "name": "", "type": "bytes" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "takerAssetFillAmount", "type": "uint256" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketSellOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_DOMAIN_HASH",
                "outputs": [{ "name": "", "type": "bytes32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "name": "makerAddress", "type": "address" },
                            { "name": "takerAddress", "type": "address" },
                            { "name": "feeRecipientAddress", "type": "address" },
                            { "name": "senderAddress", "type": "address" },
                            { "name": "makerAssetAmount", "type": "uint256" },
                            { "name": "takerAssetAmount", "type": "uint256" },
                            { "name": "makerFee", "type": "uint256" },
                            { "name": "takerFee", "type": "uint256" },
                            { "name": "expirationTimeSeconds", "type": "uint256" },
                            { "name": "salt", "type": "uint256" },
                            { "name": "makerAssetData", "type": "bytes" },
                            { "name": "takerAssetData", "type": "bytes" }
                        ],
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "name": "makerAssetFillAmount", "type": "uint256" },
                    { "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketBuyOrders",
                "outputs": [
                    {
                        "components": [
                            { "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "name": "makerFeePaid", "type": "uint256" },
                            { "name": "takerFeePaid", "type": "uint256" }
                        ],
                        "name": "totalFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "currentContextAddress",
                "outputs": [{ "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "name": "newOwner", "type": "address" }],
                "name": "transferOwnership",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "VERSION",
                "outputs": [{ "name": "", "type": "string" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [{ "name": "_zrxAssetData", "type": "bytes" }],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "name": "signerAddress", "type": "address" },
                    { "indexed": true, "name": "validatorAddress", "type": "address" },
                    { "indexed": false, "name": "approved", "type": "bool" }
                ],
                "name": "SignatureValidatorApproval",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "name": "makerAddress", "type": "address" },
                    { "indexed": true, "name": "feeRecipientAddress", "type": "address" },
                    { "indexed": false, "name": "takerAddress", "type": "address" },
                    { "indexed": false, "name": "senderAddress", "type": "address" },
                    { "indexed": false, "name": "makerAssetFilledAmount", "type": "uint256" },
                    { "indexed": false, "name": "takerAssetFilledAmount", "type": "uint256" },
                    { "indexed": false, "name": "makerFeePaid", "type": "uint256" },
                    { "indexed": false, "name": "takerFeePaid", "type": "uint256" },
                    { "indexed": true, "name": "orderHash", "type": "bytes32" },
                    { "indexed": false, "name": "makerAssetData", "type": "bytes" },
                    { "indexed": false, "name": "takerAssetData", "type": "bytes" }
                ],
                "name": "Fill",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "name": "makerAddress", "type": "address" },
                    { "indexed": true, "name": "feeRecipientAddress", "type": "address" },
                    { "indexed": false, "name": "senderAddress", "type": "address" },
                    { "indexed": true, "name": "orderHash", "type": "bytes32" },
                    { "indexed": false, "name": "makerAssetData", "type": "bytes" },
                    { "indexed": false, "name": "takerAssetData", "type": "bytes" }
                ],
                "name": "Cancel",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "name": "makerAddress", "type": "address" },
                    { "indexed": true, "name": "senderAddress", "type": "address" },
                    { "indexed": false, "name": "orderEpoch", "type": "uint256" }
                ],
                "name": "CancelUpTo",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "name": "id", "type": "bytes4" },
                    { "indexed": false, "name": "assetProxy", "type": "address" }
                ],
                "name": "AssetProxyRegistered",
                "type": "event"
            }
        ],
        "devdoc": {
            "methods": {
                "batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])": {
                    "details": "Synchronously cancels multiple orders in a single transaction.",
                    "params": { "orders": "Array of order specifications." }
                },
                "batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "Synchronously executes multiple calls of fillOrKill.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been created by makers.",
                        "takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
                    },
                    "return": "Amounts filled and fees paid by makers and taker.         NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets."
                },
                "batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "Synchronously executes multiple calls of fillOrder.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been created by makers.",
                        "takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
                    },
                    "return": "Amounts filled and fees paid by makers and taker.         NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets."
                },
                "batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "Fills an order with specified parameters and ECDSA signature.      Returns false if the transaction would otherwise revert.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been created by makers.",
                        "takerAssetFillAmounts": "Array of desired amounts of takerAsset to sell in orders."
                    },
                    "return": "Amounts filled and fees paid by makers and taker.         NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets."
                },
                "cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))": {
                    "details": "After calling, the order can not be filled anymore.      Throws if order is invalid or sender does not have permission to cancel.",
                    "params": { "order": "Order to cancel. Order must be OrderStatus.FILLABLE." }
                },
                "cancelOrdersUpTo(uint256)": {
                    "details": "Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch      and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).",
                    "params": {
                        "targetOrderEpoch": "Orders created with a salt less or equal to this value will be cancelled."
                    }
                },
                "executeTransaction(uint256,address,bytes,bytes)": {
                    "details": "Executes an exchange method call in the context of signer.",
                    "params": {
                        "data": "AbiV2 encoded calldata.",
                        "salt": "Arbitrary number to ensure uniqueness of transaction hash.",
                        "signature": "Proof of signer transaction by signer.",
                        "signerAddress": "Address of transaction signer."
                    }
                },
                "fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)": {
                    "details": "Fills the input order. Reverts if exact takerAssetFillAmount not filled.",
                    "params": {
                        "order": "Order struct containing order specifications.",
                        "signature": "Proof that order has been created by maker.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    }
                },
                "fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)": {
                    "details": "Fills the input order.",
                    "params": {
                        "order": "Order struct containing order specifications.",
                        "signature": "Proof that order has been created by maker.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    },
                    "return": "Amounts filled and fees paid by maker and taker."
                },
                "fillOrderNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)": {
                    "details": "Fills the input order.      Returns false if the transaction would otherwise revert.",
                    "params": {
                        "order": "Order struct containing order specifications.",
                        "signature": "Proof that order has been created by maker.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    },
                    "return": "Amounts filled and fees paid by maker and taker."
                },
                "getAssetProxy(bytes4)": {
                    "details": "Gets an asset proxy.",
                    "params": { "assetProxyId": "Id of the asset proxy." },
                    "return": "The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered."
                },
                "getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes))": {
                    "details": "Gets information about an order: status, hash, and amount filled.",
                    "params": { "order": "Order to gather information on." },
                    "return": "OrderInfo Information about the order and its state.         See LibOrder.OrderInfo for a complete description."
                },
                "getOrdersInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[])": {
                    "details": "Fetches information for all passed in orders.",
                    "params": { "orders": "Array of order specifications." },
                    "return": "Array of OrderInfo instances that correspond to each order."
                },
                "isValidSignature(bytes32,address,bytes)": {
                    "details": "Verifies that a hash has been signed by the given signer.",
                    "params": {
                        "hash": "Any 32 byte hash.",
                        "signature": "Proof that the hash has been signed by signer.",
                        "signerAddress": "Address that should have signed the given hash."
                    },
                    "return": "True if the address recovered from the provided signature matches the input signer address."
                },
                "marketBuyOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.",
                    "params": {
                        "makerAssetFillAmount": "Desired amount of makerAsset to buy.",
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers."
                    },
                    "return": "Amounts filled and fees paid by makers and taker."
                },
                "marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.      Returns false if the transaction would otherwise revert.",
                    "params": {
                        "makerAssetFillAmount": "Desired amount of makerAsset to buy.",
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers."
                    },
                    "return": "Amounts filled and fees paid by makers and taker."
                },
                "marketSellOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been created by makers.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    },
                    "return": "Amounts filled and fees paid by makers and taker."
                },
                "marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.      Returns false if the transaction would otherwise revert.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    },
                    "return": "Amounts filled and fees paid by makers and taker."
                },
                "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)": {
                    "details": "Match two complementary orders that have a profitable spread.      Each order is filled at their respective price point. However, the calculations are      carried out as though the orders are both being filled at the right order's price point.      The profit made by the left order goes to the taker (who matched the two orders).",
                    "params": {
                        "leftOrder": "First order to match.",
                        "leftSignature": "Proof that order was created by the left maker.",
                        "rightOrder": "Second order to match.",
                        "rightSignature": "Proof that order was created by the right maker."
                    },
                    "return": "matchedFillResults Amounts filled and fees paid by maker and taker of matched orders."
                },
                "preSign(bytes32,address,bytes)": {
                    "details": "Approves a hash on-chain using any valid signature type.      After presigning a hash, the preSign signature type will become valid for that hash and signer.",
                    "params": {
                        "signature": "Proof that the hash has been signed by signer.",
                        "signerAddress": "Address that should have signed the given hash."
                    }
                },
                "registerAssetProxy(address)": {
                    "details": "Registers an asset proxy to its asset proxy id.      Once an asset proxy is registered, it cannot be unregistered.",
                    "params": { "assetProxy": "Address of new asset proxy to register." }
                },
                "setSignatureValidatorApproval(address,bool)": {
                    "details": "Approves/unnapproves a Validator contract to verify signatures on signer's behalf.",
                    "params": {
                        "approval": "Approval or disapproval of  Validator contract.",
                        "validatorAddress": "Address of Validator contract."
                    }
                }
            }
        },
        "evm": {
            "bytecode": {
                "object": "[encoded data, 48514 characters]"
            }
        }
    },
    "networks": {}
}
