{
    "schemaVersion": "2.0.0",
    "contractName": "IZeroEx",
    "compilerOutput": {
        "abi": [
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "xAsset", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "yAsset", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "providerAddress", "type": "address" }
                ],
                "name": "LiquidityProviderForMarketUpdated",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "indexed": true, "internalType": "bytes4", "name": "selector", "type": "bytes4" },
                    { "indexed": false, "internalType": "address", "name": "signer", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }
                ],
                "name": "MetaTransactionExecuted",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "address", "name": "caller", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "migrator", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }
                ],
                "name": "Migrated",
                "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": true, "internalType": "bytes4", "name": "selector", "type": "bytes4" },
                    { "indexed": false, "internalType": "address", "name": "oldImpl", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "newImpl", "type": "address" }
                ],
                "name": "ProxyFunctionUpdated",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [{ "indexed": false, "internalType": "address", "name": "quoteSigner", "type": "address" }],
                "name": "QuoteSignerUpdated",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "taker", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "inputToken", "type": "address" },
                    { "indexed": false, "internalType": "address", "name": "outputToken", "type": "address" },
                    { "indexed": false, "internalType": "uint256", "name": "inputTokenAmount", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "outputTokenAmount", "type": "uint256" }
                ],
                "name": "TransformedERC20",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "address", "name": "transformerDeployer", "type": "address" }
                ],
                "name": "TransformerDeployerUpdated",
                "type": "event"
            },
            {
                "inputs": [
                    { "internalType": "address", "name": "sender", "type": "address" },
                    {
                        "components": [
                            { "internalType": "address payable", "name": "signer", "type": "address" },
                            { "internalType": "address", "name": "sender", "type": "address" },
                            { "internalType": "uint256", "name": "minGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "maxGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "callData", "type": "bytes" },
                            { "internalType": "uint256", "name": "value", "type": "uint256" },
                            { "internalType": "contract IERC20TokenV06", "name": "feeToken", "type": "address" },
                            { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }
                        ],
                        "internalType": "struct IMetaTransactionsFeature.MetaTransactionData",
                        "name": "mtx",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "_executeMetaTransaction",
                "outputs": [{ "internalType": "bytes", "name": "returnResult", "type": "bytes" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "contract IERC20TokenV06", "name": "token", "type": "address" },
                    { "internalType": "address", "name": "owner", "type": "address" },
                    { "internalType": "address", "name": "to", "type": "address" },
                    { "internalType": "uint256", "name": "amount", "type": "uint256" }
                ],
                "name": "_spendERC20Tokens",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address payable", "name": "taker", "type": "address" },
                            { "internalType": "contract IERC20TokenV06", "name": "inputToken", "type": "address" },
                            { "internalType": "contract IERC20TokenV06", "name": "outputToken", "type": "address" },
                            { "internalType": "uint256", "name": "inputTokenAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "minOutputTokenAmount", "type": "uint256" },
                            {
                                "components": [
                                    { "internalType": "uint32", "name": "deploymentNonce", "type": "uint32" },
                                    { "internalType": "bytes", "name": "data", "type": "bytes" }
                                ],
                                "internalType": "struct ITransformERC20Feature.Transformation[]",
                                "name": "transformations",
                                "type": "tuple[]"
                            },
                            { "internalType": "bytes32", "name": "callDataHash", "type": "bytes32" },
                            { "internalType": "bytes", "name": "callDataSignature", "type": "bytes" }
                        ],
                        "internalType": "struct ITransformERC20Feature.TransformERC20Args",
                        "name": "args",
                        "type": "tuple"
                    }
                ],
                "name": "_transformERC20",
                "outputs": [{ "internalType": "uint256", "name": "outputTokenAmount", "type": "uint256" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address payable", "name": "signer", "type": "address" },
                            { "internalType": "address", "name": "sender", "type": "address" },
                            { "internalType": "uint256", "name": "minGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "maxGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "callData", "type": "bytes" },
                            { "internalType": "uint256", "name": "value", "type": "uint256" },
                            { "internalType": "contract IERC20TokenV06", "name": "feeToken", "type": "address" },
                            { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }
                        ],
                        "internalType": "struct IMetaTransactionsFeature.MetaTransactionData[]",
                        "name": "mtxs",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }
                ],
                "name": "batchExecuteMetaTransactions",
                "outputs": [{ "internalType": "bytes[]", "name": "returnResults", "type": "bytes[]" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "createTransformWallet",
                "outputs": [{ "internalType": "contract IFlashWallet", "name": "wallet", "type": "address" }],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address payable", "name": "signer", "type": "address" },
                            { "internalType": "address", "name": "sender", "type": "address" },
                            { "internalType": "uint256", "name": "minGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "maxGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "callData", "type": "bytes" },
                            { "internalType": "uint256", "name": "value", "type": "uint256" },
                            { "internalType": "contract IERC20TokenV06", "name": "feeToken", "type": "address" },
                            { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }
                        ],
                        "internalType": "struct IMetaTransactionsFeature.MetaTransactionData",
                        "name": "mtx",
                        "type": "tuple"
                    },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "executeMetaTransaction",
                "outputs": [{ "internalType": "bytes", "name": "returnResult", "type": "bytes" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "bytes4", "name": "selector", "type": "bytes4" },
                    { "internalType": "address", "name": "impl", "type": "address" }
                ],
                "name": "extend",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "getAllowanceTarget",
                "outputs": [{ "internalType": "address", "name": "target", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }],
                "name": "getFunctionImplementation",
                "outputs": [{ "internalType": "address", "name": "impl", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "address", "name": "xAsset", "type": "address" },
                    { "internalType": "address", "name": "yAsset", "type": "address" }
                ],
                "name": "getLiquidityProviderForMarket",
                "outputs": [{ "internalType": "address", "name": "providerAddress", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address payable", "name": "signer", "type": "address" },
                            { "internalType": "address", "name": "sender", "type": "address" },
                            { "internalType": "uint256", "name": "minGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "maxGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "callData", "type": "bytes" },
                            { "internalType": "uint256", "name": "value", "type": "uint256" },
                            { "internalType": "contract IERC20TokenV06", "name": "feeToken", "type": "address" },
                            { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }
                        ],
                        "internalType": "struct IMetaTransactionsFeature.MetaTransactionData",
                        "name": "mtx",
                        "type": "tuple"
                    }
                ],
                "name": "getMetaTransactionExecutedBlock",
                "outputs": [{ "internalType": "uint256", "name": "blockNumber", "type": "uint256" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address payable", "name": "signer", "type": "address" },
                            { "internalType": "address", "name": "sender", "type": "address" },
                            { "internalType": "uint256", "name": "minGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "maxGasPrice", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "callData", "type": "bytes" },
                            { "internalType": "uint256", "name": "value", "type": "uint256" },
                            { "internalType": "contract IERC20TokenV06", "name": "feeToken", "type": "address" },
                            { "internalType": "uint256", "name": "feeAmount", "type": "uint256" }
                        ],
                        "internalType": "struct IMetaTransactionsFeature.MetaTransactionData",
                        "name": "mtx",
                        "type": "tuple"
                    }
                ],
                "name": "getMetaTransactionHash",
                "outputs": [{ "internalType": "bytes32", "name": "mtxHash", "type": "bytes32" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "bytes32", "name": "mtxHash", "type": "bytes32" }],
                "name": "getMetaTransactionHashExecutedBlock",
                "outputs": [{ "internalType": "uint256", "name": "blockNumber", "type": "uint256" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "getQuoteSigner",
                "outputs": [{ "internalType": "address", "name": "signer", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "bytes4", "name": "selector", "type": "bytes4" },
                    { "internalType": "uint256", "name": "idx", "type": "uint256" }
                ],
                "name": "getRollbackEntryAtIndex",
                "outputs": [{ "internalType": "address", "name": "impl", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "bytes4", "name": "selector", "type": "bytes4" }],
                "name": "getRollbackLength",
                "outputs": [{ "internalType": "uint256", "name": "rollbackLength", "type": "uint256" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "contract IERC20TokenV06", "name": "token", "type": "address" },
                    { "internalType": "address", "name": "owner", "type": "address" }
                ],
                "name": "getSpendableERC20BalanceOf",
                "outputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "getTransformWallet",
                "outputs": [{ "internalType": "contract IFlashWallet", "name": "wallet", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "getTransformerDeployer",
                "outputs": [{ "internalType": "address", "name": "deployer", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "internalType": "address", "name": "signer", "type": "address" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "isValidHashSignature",
                "outputs": [{ "internalType": "bool", "name": "isValid", "type": "bool" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "address", "name": "target", "type": "address" },
                    { "internalType": "bytes", "name": "data", "type": "bytes" },
                    { "internalType": "address", "name": "newOwner", "type": "address" }
                ],
                "name": "migrate",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "owner",
                "outputs": [{ "internalType": "address", "name": "ownerAddress", "type": "address" }],
                "stateMutability": "view",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "bytes4", "name": "selector", "type": "bytes4" },
                    { "internalType": "address", "name": "targetImpl", "type": "address" }
                ],
                "name": "rollback",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "address", "name": "makerToken", "type": "address" },
                    { "internalType": "address", "name": "takerToken", "type": "address" },
                    { "internalType": "address payable", "name": "recipient", "type": "address" },
                    { "internalType": "uint256", "name": "sellAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "minBuyAmount", "type": "uint256" }
                ],
                "name": "sellToLiquidityProvider",
                "outputs": [{ "internalType": "uint256", "name": "boughtAmount", "type": "uint256" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "contract IERC20TokenV06[]", "name": "tokens", "type": "address[]" },
                    { "internalType": "uint256", "name": "sellAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "minBuyAmount", "type": "uint256" },
                    { "internalType": "bool", "name": "isSushi", "type": "bool" }
                ],
                "name": "sellToUniswap",
                "outputs": [{ "internalType": "uint256", "name": "buyAmount", "type": "uint256" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "address", "name": "xAsset", "type": "address" },
                    { "internalType": "address", "name": "yAsset", "type": "address" },
                    { "internalType": "address", "name": "providerAddress", "type": "address" }
                ],
                "name": "setLiquidityProviderForMarket",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "address", "name": "quoteSigner", "type": "address" }],
                "name": "setQuoteSigner",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "address", "name": "transformerDeployer", "type": "address" }],
                "name": "setTransformerDeployer",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }],
                "name": "transferOwnership",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "contract IERC20TokenV06", "name": "inputToken", "type": "address" },
                    { "internalType": "contract IERC20TokenV06", "name": "outputToken", "type": "address" },
                    { "internalType": "uint256", "name": "inputTokenAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "minOutputTokenAmount", "type": "uint256" },
                    {
                        "components": [
                            { "internalType": "uint32", "name": "deploymentNonce", "type": "uint32" },
                            { "internalType": "bytes", "name": "data", "type": "bytes" }
                        ],
                        "internalType": "struct ITransformERC20Feature.Transformation[]",
                        "name": "transformations",
                        "type": "tuple[]"
                    }
                ],
                "name": "transformERC20",
                "outputs": [{ "internalType": "uint256", "name": "outputTokenAmount", "type": "uint256" }],
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "inputs": [
                    { "internalType": "bytes32", "name": "hash", "type": "bytes32" },
                    { "internalType": "address", "name": "signer", "type": "address" },
                    { "internalType": "bytes", "name": "signature", "type": "bytes" }
                ],
                "name": "validateHashSignature",
                "outputs": [],
                "stateMutability": "view",
                "type": "function"
            }
        ],
        "devdoc": {
            "details": "Interface for a fully featured Exchange Proxy.",
            "kind": "dev",
            "methods": {
                "_executeMetaTransaction(address,(address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256),bytes)": {
                    "details": "Execute a meta-transaction via `sender`. Privileged variant.      Only callable from within.",
                    "params": {
                        "mtx": "The meta-transaction.",
                        "sender": "Who is executing the meta-transaction..",
                        "signature": "The signature by `mtx.signer`."
                    },
                    "returns": { "returnResult": "The ABI-encoded result of the underlying call." }
                },
                "_spendERC20Tokens(address,address,address,uint256)": {
                    "details": "Transfers ERC20 tokens from `owner` to `to`.      Only callable from within.",
                    "params": {
                        "amount": "The amount of `token` to transfer.",
                        "owner": "The owner of the tokens.",
                        "to": "The recipient of the tokens.",
                        "token": "The token to spend."
                    }
                },
                "_transformERC20((address,address,address,uint256,uint256,(uint32,bytes)[],bytes32,bytes))": {
                    "details": "Internal version of `transformERC20()`. Only callable from within.",
                    "params": { "args": "A `TransformERC20Args` struct." },
                    "returns": { "outputTokenAmount": "The amount of `outputToken` received by the taker." }
                },
                "batchExecuteMetaTransactions((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256)[],bytes[])": {
                    "details": "Execute multiple meta-transactions.",
                    "params": {
                        "mtxs": "The meta-transactions.",
                        "signatures": "The signature by each respective `mtx.signer`."
                    },
                    "returns": { "returnResults": "The ABI-encoded results of the underlying calls." }
                },
                "createTransformWallet()": {
                    "details": "Deploy a new flash wallet instance and replace the current one with it.      Useful if we somehow break the current wallet instance.       Only callable by the owner.",
                    "returns": { "wallet": "The new wallet instance." }
                },
                "executeMetaTransaction((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256),bytes)": {
                    "details": "Execute a single meta-transaction.",
                    "params": { "mtx": "The meta-transaction.", "signature": "The signature by `mtx.signer`." },
                    "returns": { "returnResult": "The ABI-encoded result of the underlying call." }
                },
                "extend(bytes4,address)": {
                    "details": "Register or replace a function.",
                    "params": {
                        "impl": "The implementation contract for the function.",
                        "selector": "The function selector."
                    }
                },
                "getAllowanceTarget()": {
                    "details": "Get the address of the allowance target.",
                    "returns": { "target": "The target of token allowances." }
                },
                "getFunctionImplementation(bytes4)": {
                    "details": "Get the implementation contract of a registered function.",
                    "params": { "selector": "The function selector." },
                    "returns": { "impl": "The implementation contract address." }
                },
                "getLiquidityProviderForMarket(address,address)": {
                    "details": "Returns the address of the liquidity provider for a market given     (xAsset, yAsset), or reverts if pool does not exist.",
                    "params": {
                        "xAsset": "First asset managed by the liquidity provider.",
                        "yAsset": "Second asset managed by the liquidity provider."
                    },
                    "returns": { "providerAddress": "Address of the liquidity provider." }
                },
                "getMetaTransactionExecutedBlock((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256))": {
                    "details": "Get the block at which a meta-transaction has been executed.",
                    "params": { "mtx": "The meta-transaction." },
                    "returns": { "blockNumber": "The block height when the meta-transactioin was executed." }
                },
                "getMetaTransactionHash((address,address,uint256,uint256,uint256,uint256,bytes,uint256,address,uint256))": {
                    "details": "Get the EIP712 hash of a meta-transaction.",
                    "params": { "mtx": "The meta-transaction." },
                    "returns": { "mtxHash": "The EIP712 hash of `mtx`." }
                },
                "getMetaTransactionHashExecutedBlock(bytes32)": {
                    "details": "Get the block at which a meta-transaction hash has been executed.",
                    "params": { "mtxHash": "The meta-transaction hash." },
                    "returns": { "blockNumber": "The block height when the meta-transactioin was executed." }
                },
                "getQuoteSigner()": {
                    "details": "Return the optional signer for `transformERC20()` calldata.",
                    "returns": { "signer": "The transform deployer address." }
                },
                "getRollbackEntryAtIndex(bytes4,uint256)": {
                    "details": "Retrieve an entry in the rollback history for a function.",
                    "params": { "idx": "The index in the rollback history.", "selector": "The function selector." },
                    "returns": { "impl": "An implementation address for the function at         index `idx`." }
                },
                "getRollbackLength(bytes4)": {
                    "details": "Retrieve the length of the rollback history for a function.",
                    "params": { "selector": "The function selector." },
                    "returns": {
                        "rollbackLength": "The number of items in the rollback history for         the function."
                    }
                },
                "getSpendableERC20BalanceOf(address,address)": {
                    "details": "Gets the maximum amount of an ERC20 token `token` that can be      pulled from `owner`.",
                    "params": { "owner": "The owner of the tokens.", "token": "The token to spend." },
                    "returns": { "amount": "The amount of tokens that can be pulled." }
                },
                "getTransformWallet()": {
                    "details": "Return the current wallet instance that will serve as the execution      context for transformations.",
                    "returns": { "wallet": "The wallet instance." }
                },
                "getTransformerDeployer()": {
                    "details": "Return the allowed deployer for transformers.",
                    "returns": { "deployer": "The transform deployer address." }
                },
                "isValidHashSignature(bytes32,address,bytes)": {
                    "details": "Check that `hash` was signed by `signer` given `signature`.",
                    "params": {
                        "hash": "The hash that was signed.",
                        "signature": "The signature. The last byte of this signature should        be a member of the `SignatureType` enum.",
                        "signer": "The signer of the hash."
                    },
                    "returns": { "isValid": "`true` on success." }
                },
                "migrate(address,bytes,address)": {
                    "details": "Execute a migration function in the context of the ZeroEx contract.      The result of the function being called should be the magic bytes      0x2c64c5ef (`keccack('MIGRATE_SUCCESS')`). Only callable by the owner.      The owner will be temporarily set to `address(this)` inside the call.      Before returning, the owner will be set to `newOwner`.",
                    "params": {
                        "data": "The call data.",
                        "newOwner": "The address of the new owner.",
                        "target": "The migrator contract address."
                    }
                },
                "owner()": {
                    "details": "The owner of this contract.",
                    "returns": { "ownerAddress": "The owner address." }
                },
                "rollback(bytes4,address)": {
                    "details": "Roll back to a prior implementation of a function.",
                    "params": {
                        "selector": "The function selector.",
                        "targetImpl": "The address of an older implementation of the function."
                    }
                },
                "sellToUniswap(address[],uint256,uint256,bool)": {
                    "details": "Efficiently sell directly to uniswap/sushiswap.",
                    "params": {
                        "isSushi": "Use sushiswap if true.",
                        "minBuyAmount": "Minimum amount of `tokens[-1]` to buy.",
                        "sellAmount": "of `tokens[0]` Amount to sell.",
                        "tokens": "Sell path."
                    },
                    "returns": { "buyAmount": "Amount of `tokens[-1]` bought." }
                },
                "setLiquidityProviderForMarket(address,address,address)": {
                    "details": "Sets address of the liquidity provider for a market given      (xAsset, yAsset).",
                    "params": {
                        "providerAddress": "Address of the liquidity provider.",
                        "xAsset": "First asset managed by the liquidity provider.",
                        "yAsset": "Second asset managed by the liquidity provider."
                    }
                },
                "setQuoteSigner(address)": {
                    "details": "Replace the optional signer for `transformERC20()` calldata.      Only callable by the owner.",
                    "params": { "quoteSigner": "The address of the new calldata signer." }
                },
                "setTransformerDeployer(address)": {
                    "details": "Replace the allowed deployer for transformers.      Only callable by the owner.",
                    "params": {
                        "transformerDeployer": "The address of the new trusted deployer        for transformers."
                    }
                },
                "transferOwnership(address)": {
                    "details": "Transfers ownership of the contract to a new address.",
                    "params": { "newOwner": "The address that will become the owner." }
                },
                "transformERC20(address,address,uint256,uint256,(uint32,bytes)[])": {
                    "details": "Executes a series of transformations to convert an ERC20 `inputToken`      to an ERC20 `outputToken`.",
                    "params": {
                        "inputToken": "The token being provided by the sender.        If `0xeee...`, ETH is implied and should be provided with the call.`",
                        "inputTokenAmount": "The amount of `inputToken` to take from the sender.",
                        "minOutputTokenAmount": "The minimum amount of `outputToken` the sender        must receive for the entire transformation to succeed.",
                        "outputToken": "The token to be acquired by the sender.        `0xeee...` implies ETH.",
                        "transformations": "The transformations to execute on the token balance(s)        in sequence."
                    },
                    "returns": { "outputTokenAmount": "The amount of `outputToken` received by the sender." }
                },
                "validateHashSignature(bytes32,address,bytes)": {
                    "details": "Validate that `hash` was signed by `signer` given `signature`.      Reverts otherwise.",
                    "params": {
                        "hash": "The hash that was signed.",
                        "signature": "The signature. The last byte of this signature should        be a member of the `SignatureType` enum.",
                        "signer": "The signer of the hash."
                    }
                }
            },
            "version": 1
        },
        "evm": { "bytecode": { "object": "0x" }, "deployedBytecode": { "immutableReferences": {}, "object": "0x" } }
    },
    "compiler": {
        "name": "solc",
        "version": "0.6.12+commit.27d51765",
        "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": {}
}
