{
    "schemaVersion": "2.0.0",
    "contractName": "DevUtils",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [{ "internalType": "address", "name": "_exchange", "type": "address" }],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeAssetProxyDispatchError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.AssetProxyDispatchErrorCodes",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeAssetProxyExistsError",
                "outputs": [
                    { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" },
                    { "internalType": "address", "name": "assetProxyAddress", "type": "address" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeAssetProxyTransferError",
                "outputs": [
                    { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" },
                    { "internalType": "bytes", "name": "errorData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeEIP1271SignatureError",
                "outputs": [
                    { "internalType": "address", "name": "verifyingContractAddress", "type": "address" },
                    { "internalType": "bytes", "name": "data", "type": "bytes" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" },
                    { "internalType": "bytes", "name": "errorData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "name": "decodeERC1155AssetData",
                "outputs": [
                    { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" },
                    { "internalType": "address", "name": "tokenAddress", "type": "address" },
                    { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" },
                    { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" },
                    { "internalType": "bytes", "name": "callbackData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "name": "decodeERC20AssetData",
                "outputs": [
                    { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" },
                    { "internalType": "address", "name": "tokenAddress", "type": "address" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "name": "decodeERC721AssetData",
                "outputs": [
                    { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" },
                    { "internalType": "address", "name": "tokenAddress", "type": "address" },
                    { "internalType": "uint256", "name": "tokenId", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeExchangeInvalidContextError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.ExchangeContextErrorCodes",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                    { "internalType": "address", "name": "contextAddress", "type": "address" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeFillError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.FillErrorCodes",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeIncompleteFillError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.IncompleteFillErrorCode",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "uint256", "name": "expectedAssetFillAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "actualAssetFillAmount", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "name": "decodeMultiAssetData",
                "outputs": [
                    { "internalType": "bytes4", "name": "assetProxyId", "type": "bytes4" },
                    { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" },
                    { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeNegativeSpreadError",
                "outputs": [
                    { "internalType": "bytes32", "name": "leftOrderHash", "type": "bytes32" },
                    { "internalType": "bytes32", "name": "rightOrderHash", "type": "bytes32" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeOrderEpochError",
                "outputs": [
                    { "internalType": "address", "name": "makerAddress", "type": "address" },
                    { "internalType": "address", "name": "orderSenderAddress", "type": "address" },
                    { "internalType": "uint256", "name": "currentEpoch", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeOrderStatusError",
                "outputs": [
                    { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                    { "internalType": "enum LibOrder.OrderStatus", "name": "orderStatus", "type": "uint8" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeSignatureError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.SignatureErrorCodes",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "internalType": "address", "name": "signerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeSignatureValidatorNotApprovedError",
                "outputs": [
                    { "internalType": "address", "name": "signerAddress", "type": "address" },
                    { "internalType": "address", "name": "validatorAddress", "type": "address" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeSignatureWalletError",
                "outputs": [
                    { "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "internalType": "address", "name": "signerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" },
                    { "internalType": "bytes", "name": "errorData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeTransactionError",
                "outputs": [
                    {
                        "internalType": "enum LibExchangeRichErrors.TransactionErrorCodes",
                        "name": "errorCode",
                        "type": "uint8"
                    },
                    { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "encoded", "type": "bytes" }],
                "name": "decodeTransactionExecutionError",
                "outputs": [
                    { "internalType": "bytes32", "name": "transactionHash", "type": "bytes32" },
                    { "internalType": "bytes", "name": "errorData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes", "name": "transactionData", "type": "bytes" }],
                "name": "decodeZeroExTransactionData",
                "outputs": [
                    { "internalType": "string", "name": "functionName", "type": "string" },
                    {
                        "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[]" }
                ],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "tokenAddress", "type": "address" },
                    { "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" },
                    { "internalType": "uint256[]", "name": "tokenValues", "type": "uint256[]" },
                    { "internalType": "bytes", "name": "callbackData", "type": "bytes" }
                ],
                "name": "encodeERC1155AssetData",
                "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address", "name": "tokenAddress", "type": "address" }],
                "name": "encodeERC20AssetData",
                "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "tokenAddress", "type": "address" },
                    { "internalType": "uint256", "name": "tokenId", "type": "uint256" }
                ],
                "name": "encodeERC721AssetData",
                "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" },
                    { "internalType": "bytes[]", "name": "nestedAssetData", "type": "bytes[]" }
                ],
                "name": "encodeMultiAssetData",
                "outputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "payable": false,
                "stateMutability": "pure",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" }
                ],
                "name": "getAssetProxyAllowance",
                "outputs": [{ "internalType": "uint256", "name": "allowance", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" }
                ],
                "name": "getBalance",
                "outputs": [{ "internalType": "uint256", "name": "balance", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" }
                ],
                "name": "getBalanceAndAssetProxyAllowance",
                "outputs": [
                    { "internalType": "uint256", "name": "balance", "type": "uint256" },
                    { "internalType": "uint256", "name": "allowance", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" }
                ],
                "name": "getBatchAssetProxyAllowances",
                "outputs": [{ "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" }
                ],
                "name": "getBatchBalances",
                "outputs": [{ "internalType": "uint256[]", "name": "balances", "type": "uint256[]" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes[]", "name": "assetData", "type": "bytes[]" }
                ],
                "name": "getBatchBalancesAndAssetProxyAllowances",
                "outputs": [
                    { "internalType": "uint256[]", "name": "balances", "type": "uint256[]" },
                    { "internalType": "uint256[]", "name": "allowances", "type": "uint256[]" }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address[]", "name": "addresses", "type": "address[]" }],
                "name": "getEthBalances",
                "outputs": [{ "internalType": "uint256[]", "name": "", "type": "uint256[]" }],
                "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": "getOrderRelevantState",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint8", "name": "orderStatus", "type": "uint8" },
                            { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                            { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" }
                        ],
                        "internalType": "struct LibOrder.OrderInfo",
                        "name": "orderInfo",
                        "type": "tuple"
                    },
                    { "internalType": "uint256", "name": "fillableTakerAssetAmount", "type": "uint256" },
                    { "internalType": "bool", "name": "isValidSignature", "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": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "getOrderRelevantStates",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint8", "name": "orderStatus", "type": "uint8" },
                            { "internalType": "bytes32", "name": "orderHash", "type": "bytes32" },
                            { "internalType": "uint256", "name": "orderTakerAssetFilledAmount", "type": "uint256" }
                        ],
                        "internalType": "struct LibOrder.OrderInfo[]",
                        "name": "ordersInfo",
                        "type": "tuple[]"
                    },
                    { "internalType": "uint256[]", "name": "fillableTakerAssetAmounts", "type": "uint256[]" },
                    { "internalType": "bool[]", "name": "isValidSignature", "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": "order",
                        "type": "tuple"
                    },
                    { "internalType": "address", "name": "takerAddress", "type": "address" },
                    { "internalType": "uint256", "name": "takerAssetFillAmount", "type": "uint256" }
                ],
                "name": "getSimulatedOrderTransferResults",
                "outputs": [
                    {
                        "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults",
                        "name": "orderTransferResults",
                        "type": "uint8"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "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": "address[]", "name": "takerAddresses", "type": "address[]" },
                    { "internalType": "uint256[]", "name": "takerAssetFillAmounts", "type": "uint256[]" }
                ],
                "name": "getSimulatedOrdersTransferResults",
                "outputs": [
                    {
                        "internalType": "enum OrderTransferSimulationUtils.OrderTransferResults[]",
                        "name": "orderTransferResults",
                        "type": "uint8[]"
                    }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "ownerAddress", "type": "address" },
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" }
                ],
                "name": "getTransferableAssetAmount",
                "outputs": [{ "internalType": "uint256", "name": "transferableAssetAmount", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "decodeAssetProxyDispatchError(bytes)": {
                    "details": "Decompose an ABI-encoded AssetProxyDispatchError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode The error code.orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched."
                },
                "decodeAssetProxyExistsError(bytes)": {
                    "details": "Decompose an ABI-encoded AssetProxyExistsError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "assetProxyId Id of asset proxy.assetProxyAddress The address of the asset proxy."
                },
                "decodeAssetProxyTransferError(bytes)": {
                    "details": "Decompose an ABI-encoded AssetProxyTransferError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "orderHash Hash of the order being dispatched.assetData Asset data of the order being dispatched.errorData ABI-encoded revert data from the asset proxy."
                },
                "decodeEIP1271SignatureError(bytes)": {
                    "details": "Decompose an ABI-encoded SignatureValidatorError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract."
                },
                "decodeERC1155AssetData(bytes)": {
                    "details": "Decode ERC-1155 asset data from the format described in the AssetProxy contract specification.",
                    "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-1155 set of assets." },
                    "return": "The ERC-1155 AssetProxy identifier, the address of the ERC-1155 contract hosting the assets, an array of the identifiers of the assets to be traded, an array of asset amounts to be traded, and callback data.  Each element of the arrays corresponds to the same-indexed element of the other array.  Return values specified as `memory` are returned as pointers to locations within the memory of the input parameter `assetData`."
                },
                "decodeERC20AssetData(bytes)": {
                    "details": "Decode ERC-20 asset data from the format described in the AssetProxy contract specification.",
                    "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-20 asset." },
                    "return": "The ERC-20 AssetProxy identifier, and the address of the ERC-20  contract hosting this asset."
                },
                "decodeERC721AssetData(bytes)": {
                    "details": "Decode ERC-721 asset data from the format described in the AssetProxy contract specification.",
                    "params": { "assetData": "AssetProxy-compliant asset data describing an ERC-721 asset." },
                    "return": "The ERC-721 AssetProxy identifier, the address of the ERC-721 contract hosting this asset, and the identifier of the specific asset to be traded."
                },
                "decodeExchangeInvalidContextError(bytes)": {
                    "details": "Decompose an ABI-encoded OrderStatusError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode Error code that corresponds to invalid maker, taker, or sender.orderHash The order hash.contextAddress The maker, taker, or sender address"
                },
                "decodeFillError(bytes)": {
                    "details": "Decompose an ABI-encoded FillError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode The error code.orderHash The order hash."
                },
                "decodeIncompleteFillError(bytes)": {
                    "details": "Decompose an ABI-encoded IncompleteFillError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "orderHash Hash of the order being filled."
                },
                "decodeMultiAssetData(bytes)": {
                    "details": "Decode multi-asset data from the format described in the AssetProxy contract specification.",
                    "params": { "assetData": "AssetProxy-compliant data describing a multi-asset basket." },
                    "return": "The Multi-Asset AssetProxy identifier, an array of the amounts of the assets to be traded, and an array of the AssetProxy-compliant data describing each asset to be traded.  Each element of the arrays corresponds to the same-indexed element of the other array."
                },
                "decodeNegativeSpreadError(bytes)": {
                    "details": "Decompose an ABI-encoded NegativeSpreadError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "leftOrderHash Hash of the left order being matched.rightOrderHash Hash of the right order being matched."
                },
                "decodeOrderEpochError(bytes)": {
                    "details": "Decompose an ABI-encoded OrderEpochError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "makerAddress The order maker.orderSenderAddress The order sender.currentEpoch The current epoch for the maker."
                },
                "decodeOrderStatusError(bytes)": {
                    "details": "Decompose an ABI-encoded OrderStatusError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "orderHash The order hash.orderStatus The order status."
                },
                "decodeSignatureError(bytes)": {
                    "details": "Decompose an ABI-encoded SignatureError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature."
                },
                "decodeSignatureValidatorNotApprovedError(bytes)": {
                    "details": "Decompose an ABI-encoded SignatureValidatorNotApprovedError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "signerAddress The expected signer of the hash.validatorAddress The expected validator."
                },
                "decodeSignatureWalletError(bytes)": {
                    "details": "Decompose an ABI-encoded SignatureWalletError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode The error code.signerAddress The expected signer of the hash.signature The full signature bytes.errorData The revert data thrown by the validator contract."
                },
                "decodeTransactionError(bytes)": {
                    "details": "Decompose an ABI-encoded TransactionError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "errorCode The error code.transactionHash Hash of the transaction."
                },
                "decodeTransactionExecutionError(bytes)": {
                    "details": "Decompose an ABI-encoded TransactionExecutionError.",
                    "params": { "encoded": "ABI-encoded revert error." },
                    "return": "transactionHash Hash of the transaction.errorData Error thrown by exeucteTransaction()."
                },
                "decodeZeroExTransactionData(bytes)": {
                    "details": "Decodes the call data for an Exchange contract method call.",
                    "params": { "transactionData": "ABI-encoded calldata for an Exchange     contract method call." },
                    "return": "The name of the function called, and the parameters it was     given.  For single-order fills and cancels, the arrays will have     just one element."
                },
                "encodeERC1155AssetData(address,uint256[],uint256[],bytes)": {
                    "details": "Encode ERC-1155 asset data into the format described in the AssetProxy contract specification.",
                    "params": {
                        "callbackData": "Data to be passed to receiving contracts when a transfer is performed.",
                        "tokenAddress": "The address of the ERC-1155 contract hosting the asset(s) to be traded.",
                        "tokenIds": "The identifiers of the specific assets to be traded.",
                        "tokenValues": "The amounts of each asset to be traded."
                    },
                    "return": "AssetProxy-compliant asset data describing the set of assets."
                },
                "encodeERC20AssetData(address)": {
                    "details": "Encode ERC-20 asset data into the format described in the AssetProxy contract specification.",
                    "params": { "tokenAddress": "The address of the ERC-20 contract hosting the asset to be traded." },
                    "return": "AssetProxy-compliant data describing the asset."
                },
                "encodeERC721AssetData(address,uint256)": {
                    "details": "Encode ERC-721 asset data into the format described in the AssetProxy specification.",
                    "params": {
                        "tokenAddress": "The address of the ERC-721 contract hosting the asset to be traded.",
                        "tokenId": "The identifier of the specific asset to be traded."
                    },
                    "return": "AssetProxy-compliant asset data describing the asset."
                },
                "encodeMultiAssetData(uint256[],bytes[])": {
                    "details": "Encode data for multiple assets, per the AssetProxy contract specification.",
                    "params": {
                        "amounts": "The amounts of each asset to be traded.",
                        "nestedAssetData": "AssetProxy-compliant data describing each asset to be traded."
                    },
                    "return": "AssetProxy-compliant data describing the set of assets."
                },
                "getAssetProxyAllowance(address,bytes)": {
                    "details": "Returns the number of asset(s) (described by assetData) that the corresponding AssetProxy contract is authorized to spend.  When the asset data contains multiple assets (eg for Multi-Asset), the return value indicates how many complete \"baskets\" of those assets may be spent by all of the corresponding AssetProxy contracts.",
                    "params": {
                        "assetData": "Details of asset, encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "Number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend."
                },
                "getBalance(address,bytes)": {
                    "details": "Returns the owner's balance of the assets(s) specified in assetData.  When the asset data contains multiple assets (eg in ERC1155 or Multi-Asset), the return value indicates how many complete \"baskets\" of those assets are owned by owner.",
                    "params": {
                        "assetData": "Details of asset, encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "Number of assets (or asset baskets) held by owner."
                },
                "getBalanceAndAssetProxyAllowance(address,bytes)": {
                    "details": "Calls getBalance() and getAllowance() for assetData.",
                    "params": {
                        "assetData": "Details of asset, encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "Number of assets (or asset baskets) held by owner, and number of assets (or asset baskets) that the corresponding AssetProxy is authorized to spend."
                },
                "getBatchAssetProxyAllowances(address,bytes[])": {
                    "details": "Calls getAssetProxyAllowance() for each element of assetData.",
                    "params": {
                        "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "An array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input."
                },
                "getBatchBalances(address,bytes[])": {
                    "details": "Calls getBalance() for each element of assetData.",
                    "params": {
                        "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "Array of asset balances from getBalance(), with each element corresponding to the same-indexed element in the assetData input."
                },
                "getBatchBalancesAndAssetProxyAllowances(address,bytes[])": {
                    "details": "Calls getBatchBalances() and getBatchAllowances() for each element of assetData.",
                    "params": {
                        "assetData": "Array of asset details, each encoded per the AssetProxy contract specification.",
                        "ownerAddress": "Owner of the assets specified by assetData."
                    },
                    "return": "An array of asset balances from getBalance(), and an array of asset allowances from getAllowance(), with each element corresponding to the same-indexed element in the assetData input."
                },
                "getEthBalances(address[])": {
                    "details": "Batch fetches ETH balances",
                    "params": { "addresses": "Array of addresses." },
                    "return": "Array of ETH balances."
                },
                "getOrderRelevantState((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),bytes)": {
                    "details": "Fetches all order-relevant information needed to validate if the supplied order is fillable.",
                    "params": {
                        "order": "The order structure.",
                        "signature": "Signature provided by maker that proves the order's authenticity. `0x01` can always be provided if the signature does not need to be validated."
                    },
                    "return": "The orderInfo (hash, status, and `takerAssetAmount` already filled for the given order), fillableTakerAssetAmount (amount of the order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (validity of the provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, `fillableTakerAssetAmount` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled."
                },
                "getOrderRelevantStates((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[])": {
                    "details": "Fetches all order-relevant information needed to validate if the supplied orders are fillable.",
                    "params": {
                        "orders": "Array of order structures.",
                        "signatures": "Array of signatures provided by makers that prove the authenticity of the orders. `0x01` can always be provided if a signature does not need to be validated."
                    },
                    "return": "The ordersInfo (array of the hash, status, and `takerAssetAmount` already filled for each order), fillableTakerAssetAmounts (array of amounts for each order's `takerAssetAmount` that is fillable given all on-chain state), and isValidSignature (array containing the validity of each provided signature). NOTE: If the `takerAssetData` encodes data for multiple assets, each element of `fillableTakerAssetAmounts` will represent a \"scaled\" amount, meaning it must be multiplied by all the individual asset amounts within the `takerAssetData` to get the final amount of each asset that can be filled."
                },
                "getSimulatedOrderTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes),address,uint256)": {
                    "details": "Simulates all of the transfers within an order and returns the index of the first failed transfer.",
                    "params": {
                        "order": "The order to simulate transfers for.",
                        "takerAddress": "The address of the taker that will fill the order.",
                        "takerAssetFillAmount": "The amount of takerAsset that the taker wished to fill."
                    },
                    "return": "The index of the first failed transfer (or 4 if all transfers are successful)."
                },
                "getSimulatedOrdersTransferResults((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],address[],uint256[])": {
                    "details": "Simulates all of the transfers for each given order and returns the indices of each first failed transfer.",
                    "params": {
                        "orders": "Array of orders to individually simulate transfers for.",
                        "takerAddresses": "Array of addresses of takers that will fill each order.",
                        "takerAssetFillAmounts": "Array of amounts of takerAsset that will be filled for each order."
                    },
                    "return": "The indices of the first failed transfer (or 4 if all transfers are successful) for each order."
                },
                "getTransferableAssetAmount(address,bytes)": {
                    "details": "Gets the amount of an asset transferable by the owner.",
                    "params": {
                        "assetData": "Description of tokens, per the AssetProxy contract specification.",
                        "ownerAddress": "Address of the owner of the asset."
                    },
                    "return": "The amount of the asset tranferable by the owner. NOTE: If the `assetData` encodes data for multiple assets, the `transferableAssetAmount` will represent the amount of times the entire `assetData` can be transferred. To calculate the total individual transferable amounts, this scaled `transferableAmount` must be multiplied by the individual asset amounts located within the `assetData`."
                }
            }
        },
        "evm": {
            "bytecode": {
                "object": "[encoded data, 47442 characters]"
            },
            "deployedBytecode": {
                "object": "[encoded data, 45308 characters]"
            }
        }
    },
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.5.12+commit.7709ece9.js",
        "settings": {
            "optimizer": {
                "enabled": true,
                "runs": 10000,
                "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": "constantinople"
        }
    },
    "networks": {}
}
