{
    "schemaVersion": "2.0.0",
    "contractName": "Forwarder",
    "compilerOutput": {
        "abi": [
            {
                "inputs": [
                    { "internalType": "address", "name": "_exchange", "type": "address" },
                    { "internalType": "bytes", "name": "_wethAssetData", "type": "bytes" }
                ],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "constructor"
            },
            { "payable": true, "stateMutability": "payable", "type": "fallback" },
            {
                "constant": false,
                "inputs": [{ "internalType": "bytes", "name": "assetData", "type": "bytes" }],
                "name": "approveMakerAssetProxy",
                "outputs": [],
                "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": "uint256", "name": "makerAssetBuyAmount", "type": "uint256" },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" },
                    { "internalType": "uint256", "name": "feePercentage", "type": "uint256" },
                    { "internalType": "address payable", "name": "feeRecipient", "type": "address" }
                ],
                "name": "marketBuyOrdersWithEth",
                "outputs": [
                    { "internalType": "uint256", "name": "wethSpentAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "makerAssetAcquiredAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "ethFeePaid", "type": "uint256" }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "makerAddress", "type": "address" },
                            { "internalType": "address", "name": "takerAddress", "type": "address" },
                            { "internalType": "address", "name": "feeRecipientAddress", "type": "address" },
                            { "internalType": "address", "name": "senderAddress", "type": "address" },
                            { "internalType": "uint256", "name": "makerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerAssetAmount", "type": "uint256" },
                            { "internalType": "uint256", "name": "makerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "takerFee", "type": "uint256" },
                            { "internalType": "uint256", "name": "expirationTimeSeconds", "type": "uint256" },
                            { "internalType": "uint256", "name": "salt", "type": "uint256" },
                            { "internalType": "bytes", "name": "makerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "makerFeeAssetData", "type": "bytes" },
                            { "internalType": "bytes", "name": "takerFeeAssetData", "type": "bytes" }
                        ],
                        "internalType": "struct LibOrder.Order[]",
                        "name": "orders",
                        "type": "tuple[]"
                    },
                    { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" },
                    { "internalType": "uint256", "name": "feePercentage", "type": "uint256" },
                    { "internalType": "address payable", "name": "feeRecipient", "type": "address" }
                ],
                "name": "marketSellOrdersWithEth",
                "outputs": [
                    { "internalType": "uint256", "name": "wethSpentAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "makerAssetAcquiredAmount", "type": "uint256" },
                    { "internalType": "uint256", "name": "ethFeePaid", "type": "uint256" }
                ],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "owner",
                "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }],
                "name": "transferOwnership",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "bytes", "name": "assetData", "type": "bytes" },
                    { "internalType": "uint256", "name": "amount", "type": "uint256" }
                ],
                "name": "withdrawAsset",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "approveMakerAssetProxy(bytes)": {
                    "details": "Approves the respective proxy for a given asset to transfer tokens on the Forwarder contract's behalf.      This is necessary because an order fee denominated in the maker asset (i.e. a percentage fee) is sent by the      Forwarder contract to the fee recipient.      This method needs to be called before forwarding orders of a maker asset that hasn't      previously been approved.",
                    "params": { "assetData": "Byte array encoded for the respective asset proxy." }
                },
                "marketBuyOrdersWithEth((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],uint256,bytes[],uint256,address)": {
                    "details": "Attempt to buy makerAssetBuyAmount of makerAsset by selling ETH provided with transaction.      The Forwarder may *fill* more than makerAssetBuyAmount of the makerAsset so that it can      pay takerFees where takerFeeAssetData == makerAssetData (i.e. percentage fees).      Any ETH not spent will be refunded to sender.",
                    "params": {
                        "feePercentage": "Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.",
                        "feeRecipient": "Address that will receive ETH when orders are filled.",
                        "makerAssetBuyAmount": "Desired amount of makerAsset to purchase.",
                        "orders": "Array of order specifications used containing desired makerAsset and WETH as takerAsset.",
                        "signatures": "Proofs that orders have been created by makers."
                    },
                    "return": "wethSpentAmount Amount of WETH spent on the given set of orders.makerAssetAcquiredAmount Amount of maker asset acquired from the given set of orders.ethFeePaid Amount of ETH spent on the given forwarder fee."
                },
                "marketSellOrdersWithEth((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)[],bytes[],uint256,address)": {
                    "details": "Purchases as much of orders' makerAssets as possible by selling as much of the ETH value sent      as possible, accounting for order and forwarder fees.",
                    "params": {
                        "feePercentage": "Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.",
                        "feeRecipient": "Address that will receive ETH when orders are filled.",
                        "orders": "Array of order specifications used containing desired makerAsset and WETH as takerAsset.",
                        "signatures": "Proofs that orders have been created by makers."
                    },
                    "return": "wethSpentAmount Amount of WETH spent on the given set of orders.makerAssetAcquiredAmount Amount of maker asset acquired from the given set of orders.ethFeePaid Amount of ETH spent on the given forwarder fee."
                },
                "withdrawAsset(bytes,uint256)": {
                    "details": "Withdraws assets from this contract. The contract formerly required a ZRX balance in order      to function optimally, and this function allows the ZRX to be withdrawn by owner.      It may also be used to withdraw assets that were accidentally sent to this contract.",
                    "params": {
                        "amount": "Amount of ERC20 token to withdraw.",
                        "assetData": "Byte array encoded for the respective asset proxy."
                    }
                }
            }
        },
        "evm": {
            "bytecode": {
                "object": "[encoded data, 20688 characters]"
            },
            "deployedBytecode": {
                "object": "[encoded data, 17012 characters]"
            }
        }
    },
    "compiler": {
        "name": "solc",
        "version": "soljson-v0.5.12+commit.7709ece9.js",
        "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": "constantinople"
        }
    },
    "networks": {}
}
