{
    "schemaVersion": "2.0.0",
    "contractName": "Exchange",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [{ "internalType": "uint256", "name": "chainId", "type": "uint256" }],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "bytes4", "name": "id", "type": "bytes4" },
                    { "indexed": false, "internalType": "address", "name": "assetProxy", "type": "address" }
                ],
                "name": "AssetProxyRegistered",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "makerAddress", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                    { "indexed": false, "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                    { "indexed": false, "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                    { "indexed": false, "internalType": "address", "name": "senderAddress", "type": "address" },
                    { "indexed": true, "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }
                ],
                "name": "Cancel",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "makerAddress", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "orderSenderAddress", "type": "address" },
                    { "indexed": false, "internalType": "uint256", "name": "orderEpoch", "type": "uint256" }
                ],
                "name": "CancelUpTo",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "makerAddress", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                    { "indexed": false, "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                    { "indexed": false, "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                    { "indexed": false, "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                    { "indexed": false, "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" },
                    { "indexed": true, "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                    { "indexed": false, "internalType": "address", "name": "takerAddress", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "senderAddress", "type": "address" },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "makerAssetFilledAmount",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "takerAssetFilledAmount",
                        "type": "uint256"
                    },
                    { "indexed": false, "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                ],
                "name": "Fill",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }
                ],
                "name": "OwnershipTransferred",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "oldProtocolFeeCollector",
                        "type": "address"
                    },
                    {
                        "indexed": false,
                        "internalType": "address",
                        "name": "updatedProtocolFeeCollector",
                        "type": "address"
                    }
                ],
                "name": "ProtocolFeeCollectorAddress",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "oldProtocolFeeMultiplier",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "updatedProtocolFeeMultiplier",
                        "type": "uint256"
                    }
                ],
                "name": "ProtocolFeeMultiplier",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "signerAddress", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "validatorAddress", "type": "address" },
                    { "indexed": false, "internalType": "bool", "name": "isApproved", "type": "bool" }
                ],
                "name": "SignatureValidatorApproval",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }
                ],
                "name": "TransactionExecution",
                "type": "event"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP1271_MAGIC_VALUE",
                "outputs": [{ "internalType": "bytes4", "name": "", "type": "bytes4" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "EIP712_EXCHANGE_DOMAIN_HASH",
                "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "", "type": "address" },
                    { "internalType": "address", "name": "", "type": "address" }
                ],
                "name": "allowedValidators",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    }
                ],
                "name": "batchCancelOrders",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
                            { "internalType": "address", "name": "signerAddress", "type": "address" },
                            { "internalType": "bytes", "name": "data", "type": "bytes" }
                        ],
                        "internalType": "struct LibZeroExTransaction.ZeroExTransaction[]",
                        "name": "transactions",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchExecuteTransactions",
                "outputs": [{ "internalType": "bytes[]", "name": "returnData", "type": "bytes[]" }],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrKillOrders",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults[]",
                        "name": "fillResults",
                        "type": "tuple[]"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrders",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults[]",
                        "name": "fillResults",
                        "type": "tuple[]"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchFillOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults[]",
                        "name": "fillResults",
                        "type": "tuple[]"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "leftOrders",
                        "type": "tuple[]"
                    },
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "rightOrders",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "leftSignatures", "type": "bytes[]" },
                    { "internalType": "bytes[]", "name": "rightSignatures", "type": "bytes[]" }
                ],
                "name": "batchMatchOrders",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults[]",
                                "name": "left",
                                "type": "tuple[]"
                            },
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults[]",
                                "name": "right",
                                "type": "tuple[]"
                            },
                            { "internalType": "uint256", "name": "profitInLeftMakerAsset", "type": "uint256" },
                            { "internalType": "uint256", "name": "profitInRightMakerAsset", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.BatchMatchedFillResults",
                        "name": "batchMatchedFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "leftOrders",
                        "type": "tuple[]"
                    },
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "rightOrders",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "leftSignatures", "type": "bytes[]" },
                    { "internalType": "bytes[]", "name": "rightSignatures", "type": "bytes[]" }
                ],
                "name": "batchMatchOrdersWithMaximalFill",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults[]",
                                "name": "left",
                                "type": "tuple[]"
                            },
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults[]",
                                "name": "right",
                                "type": "tuple[]"
                            },
                            { "internalType": "uint256", "name": "profitInLeftMakerAsset", "type": "uint256" },
                            { "internalType": "uint256", "name": "profitInRightMakerAsset", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.BatchMatchedFillResults",
                        "name": "batchMatchedFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "order",
                        "type": "tuple"
                    }
                ],
                "name": "cancelOrder",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "uint256", "name": "targetOrderEpoch", "type": "uint256" }],
                "name": "cancelOrdersUpTo",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "name": "cancelled",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "currentContextAddress",
                "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [],
                "name": "detachProtocolFeeCollector",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
                            { "internalType": "address", "name": "signerAddress", "type": "address" },
                            { "internalType": "bytes", "name": "data", "type": "bytes" }
                        ],
                        "internalType": "struct LibZeroExTransaction.ZeroExTransaction",
                        "name": "transaction",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "executeTransaction",
                "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "order",
                        "type": "tuple"
                    },
                    { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "fillOrKillOrder",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "order",
                        "type": "tuple"
                    },
                    { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "fillOrder",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "name": "filled",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" }],
                "name": "getAssetProxy",
                "outputs": [{ "internalType": "address", "name": "assetProxy", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "order",
                        "type": "tuple"
                    }
                ],
                "name": "getOrderInfo",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "enum LibOrder.OrderStatus", "name": "orderStatus", "type": "uint8" },
                            { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                            { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" }
                        ],
                        "internalType": "struct LibOrder.OrderInfo",
                        "name": "orderInfo",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "internalType": "address", "name": "signerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "isValidHashSignature",
                "outputs": [{ "internalType": "bool", "name": "isValid", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "order",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "isValidOrderSignature",
                "outputs": [{ "internalType": "bool", "name": "isValid", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "gasPrice", "type": "uint256" },
                            { "internalType": "address", "name": "signerAddress", "type": "address" },
                            { "internalType": "bytes", "name": "data", "type": "bytes" }
                        ],
                        "internalType": "struct LibZeroExTransaction.ZeroExTransaction",
                        "name": "transaction",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "isValidTransactionSignature",
                "outputs": [{ "internalType": "bool", "name": "isValid", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256", "name": "makerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketBuyOrdersFillOrKill",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256", "name": "makerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketBuyOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketSellOrdersFillOrKill",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "marketSellOrdersNoThrow",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                            { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.FillResults",
                        "name": "fillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "leftOrder",
                        "type": "tuple"
                    },
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "rightOrder",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "leftSignature", "type": "bytes" },
                    { "internalType": "bytes", "name": "rightSignature", "type": "bytes" }
                ],
                "name": "matchOrders",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults",
                                "name": "left",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults",
                                "name": "right",
                                "type": "tuple"
                            },
                            { "internalType": "uint256", "name": "profitInLeftMakerAsset", "type": "uint256" },
                            { "internalType": "uint256", "name": "profitInRightMakerAsset", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.MatchedFillResults",
                        "name": "matchedFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "leftOrder",
                        "type": "tuple"
                    },
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order",
                        "name": "rightOrder",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "leftSignature", "type": "bytes" },
                    { "internalType": "bytes", "name": "rightSignature", "type": "bytes" }
                ],
                "name": "matchOrdersWithMaximalFill",
                "outputs": [
                    {
                        "components": [
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults",
                                "name": "left",
                                "type": "tuple"
                            },
                            {
                                "components": [
                                    { "internalType": "uint256", "name": "makerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerAssetFilledAmount", "type": "uint256" },
                                    { "internalType": "uint256", "name": "makerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "takerFeePaid", "type": "uint256" },
                                    { "internalType": "uint256", "name": "protocolFeePaid", "type": "uint256" }
                                ],
                                "internalType": "struct LibFillResults.FillResults",
                                "name": "right",
                                "type": "tuple"
                            },
                            { "internalType": "uint256", "name": "profitInLeftMakerAsset", "type": "uint256" },
                            { "internalType": "uint256", "name": "profitInRightMakerAsset", "type": "uint256" }
                        ],
                        "internalType": "struct LibFillResults.MatchedFillResults",
                        "name": "matchedFillResults",
                        "type": "tuple"
                    }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "", "type": "address" },
                    { "internalType": "address", "name": "", "type": "address" }
                ],
                "name": "orderEpoch",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "owner",
                "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "bytes32", "name": "hash", "type": "bytes32" }],
                "name": "preSign",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "bytes32", "name": "", "type": "bytes32" },
                    { "internalType": "address", "name": "", "type": "address" }
                ],
                "name": "preSigned",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "protocolFeeCollector",
                "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "protocolFeeMultiplier",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "assetProxy", "type": "address" }],
                "name": "registerAssetProxy",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "updatedProtocolFeeCollector", "type": "address" }],
                "name": "setProtocolFeeCollectorAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "uint256", "name": "updatedProtocolFeeMultiplier", "type": "uint256" }],
                "name": "setProtocolFeeMultiplier",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "address", "name": "validatorAddress", "type": "address" },
                    { "internalType": "bool", "name": "approval", "type": "bool" }
                ],
                "name": "setSignatureValidatorApproval",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" },
                    { "internalType": "address[]", "name": "fromAddresses", "type": "address[]" },
                    { "internalType": "address[]", "name": "toAddresses", "type": "address[]" },
                    { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }
                ],
                "name": "simulateDispatchTransferFromCalls",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "name": "transactionsExecuted",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }],
                "name": "transferOwnership",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "details": "The 0x Exchange contract.",
            "methods": {
                "batchCancelOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[])": {
                    "details": "Executes multiple calls of cancelOrder.",
                    "params": { "orders": "Array of order specifications." }
                },
                "batchExecuteTransactions((uint256,uint256,uint256,address,bytes)[],bytes[])": {
                    "details": "Executes a batch of Exchange method calls in the context of signer(s).",
                    "params": {
                        "signatures": "Array of proofs that transactions have been signed by signer(s).",
                        "transactions": "Array of 0x transaction structures."
                    },
                    "return": "returnData Array containing ABI encoded return data for each of the underlying Exchange function calls."
                },
                "batchFillOrKillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "Executes multiple calls of fillOrKillOrder.",
                    "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": "fillResults Array of amounts filled and fees paid by makers and taker."
                },
                "batchFillOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "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": "fillResults Array of amounts filled and fees paid by makers and taker."
                },
                "batchFillOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256[],bytes[])": {
                    "details": "Executes multiple calls of fillOrder. If any fill reverts, the error is caught and ignored.",
                    "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": "fillResults Array of amounts filled and fees paid by makers and taker."
                },
                "batchMatchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])": {
                    "details": "Match complementary orders that have a profitable spread.      Each order is filled at their respective price point, and      the matcher receives a profit denominated in the left maker asset.",
                    "params": {
                        "leftOrders": "Set of orders with the same maker / taker asset.",
                        "leftSignatures": "Proof that left orders were created by the left makers.",
                        "rightOrders": "Set of orders to match against `leftOrders`",
                        "rightSignatures": "Proof that right orders were created by the right makers."
                    },
                    "return": "batchMatchedFillResults Amounts filled and profit generated."
                },
                "batchMatchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],bytes[])": {
                    "details": "Match complementary orders that have a profitable spread.      Each order is maximally filled at their respective price point, and      the matcher receives a profit denominated in either the left maker asset,      right maker asset, or a combination of both.",
                    "params": {
                        "leftOrders": "Set of orders with the same maker / taker asset.",
                        "leftSignatures": "Proof that left orders were created by the left makers.",
                        "rightOrders": "Set of orders to match against `leftOrders`",
                        "rightSignatures": "Proof that right orders were created by the right makers."
                    },
                    "return": "batchMatchedFillResults Amounts filled and profit generated."
                },
                "cancelOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes))": {
                    "details": "After calling, the order can not be filled anymore.",
                    "params": { "order": "Order struct containing order specifications." }
                },
                "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."
                    }
                },
                "constructor": {
                    "details": "Mixins are instantiated in the order they are inherited",
                    "params": { "chainId": "Chain ID of the network this contract is deployed on." }
                },
                "detachProtocolFeeCollector()": {
                    "details": "Sets the protocolFeeCollector contract address to 0.      Only callable by owner."
                },
                "executeTransaction((uint256,uint256,uint256,address,bytes),bytes)": {
                    "details": "Executes an Exchange method call in the context of signer.",
                    "params": {
                        "signature": "Proof that transaction has been signed by signer.",
                        "transaction": "0x transaction structure."
                    },
                    "return": "ABI encoded return data of the underlying Exchange function call."
                },
                "fillOrKillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,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."
                    },
                    "return": "fillResults Amounts filled and fees paid."
                },
                "fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,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": "fillResults Amounts filled and fees paid by maker and taker."
                },
                "getAssetProxy(bytes4)": {
                    "details": "Gets an asset proxy.",
                    "params": { "assetProxyId": "Id of the asset proxy." },
                    "return": "assetProxy The asset proxy address registered to assetProxyId. Returns 0x0 if no proxy is registered."
                },
                "getOrderInfo((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,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."
                },
                "isValidHashSignature(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": "isValid `true` if the signature is valid for the given hash and signer."
                },
                "isValidOrderSignature((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": {
                    "details": "Verifies that a signature for an order is valid.",
                    "params": { "order": "The order.", "signature": "Proof that the order has been signed by signer." },
                    "return": "isValid `true` if the signature is valid for the given order and signer."
                },
                "isValidTransactionSignature((uint256,uint256,uint256,address,bytes),bytes)": {
                    "details": "Verifies that a signature for a transaction is valid.",
                    "params": {
                        "signature": "Proof that the order has been signed by signer.",
                        "transaction": "The transaction."
                    },
                    "return": "isValid `true` if the signature is valid for the given transaction and signer."
                },
                "marketBuyOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Calls marketBuyOrdersNoThrow then reverts if < makerAssetFillAmount has been bought.      NOTE: This function does not enforce that the makerAsset is the same for each order.",
                    "params": {
                        "makerAssetFillAmount": "Minimum amount of makerAsset to buy.",
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers."
                    },
                    "return": "fillResults Amounts filled and fees paid by makers and taker."
                },
                "marketBuyOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.      If any fill reverts, the error is caught and ignored.      NOTE: This function does not enforce that the makerAsset is the same for each order.",
                    "params": {
                        "makerAssetFillAmount": "Desired amount of makerAsset to buy.",
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers."
                    },
                    "return": "fillResults Amounts filled and fees paid by makers and taker."
                },
                "marketSellOrdersFillOrKill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Calls marketSellOrdersNoThrow then reverts if < takerAssetFillAmount has been sold.      NOTE: This function does not enforce that the takerAsset is the same for each order.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers.",
                        "takerAssetFillAmount": "Minimum amount of takerAsset to sell."
                    },
                    "return": "fillResults Amounts filled and fees paid by makers and taker."
                },
                "marketSellOrdersNoThrow((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[])": {
                    "details": "Executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.      If any fill reverts, the error is caught and ignored.      NOTE: This function does not enforce that the takerAsset is the same for each order.",
                    "params": {
                        "orders": "Array of order specifications.",
                        "signatures": "Proofs that orders have been signed by makers.",
                        "takerAssetFillAmount": "Desired amount of takerAsset to sell."
                    },
                    "return": "fillResults Amounts filled and fees paid by makers and taker."
                },
                "matchOrders((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,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."
                },
                "matchOrdersWithMaximalFill((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes,bytes)": {
                    "details": "Match two complementary orders that have a profitable spread.      Each order is maximally filled at their respective price point, and      the matcher receives a profit denominated in either the left maker asset,      right maker asset, or a combination of both.",
                    "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 by maker and taker of matched orders."
                },
                "preSign(bytes32)": {
                    "details": "Approves a hash on-chain.      After presigning a hash, the preSign signature type will become valid for that hash and signer.",
                    "params": { "hash": "Any 32-byte 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." }
                },
                "setProtocolFeeCollectorAddress(address)": {
                    "details": "Allows the owner to update the protocolFeeCollector address.",
                    "params": { "updatedProtocolFeeCollector": "The updated protocolFeeCollector contract address." }
                },
                "setProtocolFeeMultiplier(uint256)": {
                    "details": "Allows the owner to update the protocol fee multiplier.",
                    "params": { "updatedProtocolFeeMultiplier": "The updated protocol fee multiplier." }
                },
                "setSignatureValidatorApproval(address,bool)": {
                    "details": "Approves/unnapproves a Validator contract to verify signatures on signer's behalf      using the `Validator` signature type.",
                    "params": {
                        "approval": "Approval or disapproval of  Validator contract.",
                        "validatorAddress": "Address of Validator contract."
                    }
                },
                "simulateDispatchTransferFromCalls(bytes[],address[],address[],uint256[])": {
                    "details": "This function may be used to simulate any amount of transfers As they would occur through the Exchange contract. Note that this function will always revert, even if all transfers are successful. However, it may be used with eth_call or with a try/catch pattern in order to simulate the results of the transfers.",
                    "params": {
                        "amounts": "Array containing the amounts that correspond to each transfer.",
                        "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.",
                        "fromAddresses": "Array containing the `from` addresses that correspond with each transfer.",
                        "toAddresses": "Array containing the `to` addresses that correspond with each transfer."
                    },
                    "return": "This function does not return a value. However, it will always revert with `Error(\"TRANSFERS_SUCCESSFUL\")` if all of the transfers were successful."
                },
                "transferOwnership(address)": {
                    "details": "Change the owner of this contract.",
                    "params": { "newOwner": "New owner address." }
                }
            }
        },
        "evm": {
            "bytecode": {
                "object": "[encoded data, 47976 characters]"
            },
            "deployedBytecode": {
                "object": "[encoded data, 47336 characters]"
            }
        }
    },
    "compiler": {
        "name": "solc",
        "version": "0.5.17+commit.d19bba13",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 1000000,
                "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
            },
            "outputSelection": {
                "*": {
                    "*": [
                        "abi",
                        "devdoc",
                        "evm.bytecode.object",
                        "evm.bytecode.sourceMap",
                        "evm.deployedBytecode.object",
                        "evm.deployedBytecode.sourceMap"
                    ]
                }
            },
            "evmVersion": "istanbul"
        }
    },
    "chains": {}
}
