{
    "schemaVersion": "2.0.0",
    "contractName": "Staking",
    "compilerOutput": {
        "abi": [
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "target", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }
                ],
                "name": "AuthorizedAddressAdded",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "target", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }
                ],
                "name": "AuthorizedAddressRemoved",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" }
                ],
                "name": "EpochEnded",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "rewardsPaid", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "rewardsRemaining", "type": "uint256" }
                ],
                "name": "EpochFinalized",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }
                ],
                "name": "ExchangeAdded",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }
                ],
                "name": "ExchangeRemoved",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "makerAddress", "type": "address" },
                    { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
                ],
                "name": "MakerStakingPoolSet",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
                    { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" },
                    { "indexed": false, "internalType": "uint8", "name": "fromStatus", "type": "uint8" },
                    { "indexed": true, "internalType": "bytes32", "name": "fromPool", "type": "bytes32" },
                    { "indexed": false, "internalType": "uint8", "name": "toStatus", "type": "uint8" },
                    { "indexed": true, "internalType": "bytes32", "name": "toPool", "type": "bytes32" }
                ],
                "name": "MoveStake",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
                    { "indexed": false, "internalType": "uint32", "name": "oldOperatorShare", "type": "uint32" },
                    { "indexed": false, "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" }
                ],
                "name": "OperatorShareDecreased",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" },
                    { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }
                ],
                "name": "OwnershipTransferred",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "epochDurationInSeconds",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint32",
                        "name": "rewardDelegatedStakeWeight",
                        "type": "uint32"
                    },
                    { "indexed": false, "internalType": "uint256", "name": "minimumPoolStake", "type": "uint256" },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "cobbDouglasAlphaNumerator",
                        "type": "uint256"
                    },
                    {
                        "indexed": false,
                        "internalType": "uint256",
                        "name": "cobbDouglasAlphaDenominator",
                        "type": "uint256"
                    }
                ],
                "name": "ParamsSet",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
                    { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
                    { "indexed": false, "internalType": "uint256", "name": "operatorReward", "type": "uint256" },
                    { "indexed": false, "internalType": "uint256", "name": "membersReward", "type": "uint256" }
                ],
                "name": "RewardsPaid",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
                    { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }
                ],
                "name": "Stake",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": false, "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
                    { "indexed": false, "internalType": "address", "name": "operator", "type": "address" },
                    { "indexed": false, "internalType": "uint32", "name": "operatorShare", "type": "uint32" }
                ],
                "name": "StakingPoolCreated",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" },
                    { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
                ],
                "name": "StakingPoolEarnedRewardsInEpoch",
                "type": "event"
            },
            {
                "anonymous": false,
                "inputs": [
                    { "indexed": true, "internalType": "address", "name": "staker", "type": "address" },
                    { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }
                ],
                "name": "Unstake",
                "type": "event"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "target", "type": "address" }],
                "name": "addAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }],
                "name": "addExchangeAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "name": "aggregatedStatsByEpoch",
                "outputs": [
                    { "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" },
                    { "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" },
                    { "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" },
                    { "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" },
                    { "internalType": "uint256", "name": "totalRewardsFinalized", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "name": "authorities",
                "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "name": "authorized",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "cobbDouglasAlphaDenominator",
                "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "cobbDouglasAlphaNumerator",
                "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
                    { "internalType": "address", "name": "member", "type": "address" }
                ],
                "name": "computeRewardBalanceOfDelegator",
                "outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "computeRewardBalanceOfOperator",
                "outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "uint32", "name": "operatorShare", "type": "uint32" },
                    { "internalType": "bool", "name": "addOperatorAsMaker", "type": "bool" }
                ],
                "name": "createStakingPool",
                "outputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "currentEpoch",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "currentEpochStartTimeInSeconds",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "bytes32", "name": "poolId", "type": "bytes32" },
                    { "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" }
                ],
                "name": "decreaseStakingPoolOperatorShare",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [],
                "name": "endEpoch",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "epochDurationInSeconds",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "finalizePool",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getAuthorizedAddresses",
                "outputs": [{ "internalType": "address[]", "name": "", "type": "address[]" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getCurrentEpochEarliestEndTimeInSeconds",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" }],
                "name": "getGlobalStakeByStatus",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
                            { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
                            { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
                        ],
                        "internalType": "struct IStructs.StoredBalance",
                        "name": "balance",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "staker", "type": "address" },
                    { "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" }
                ],
                "name": "getOwnerStakeByStatus",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
                            { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
                            { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
                        ],
                        "internalType": "struct IStructs.StoredBalance",
                        "name": "balance",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getParams",
                "outputs": [
                    { "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" },
                    { "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" },
                    { "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" },
                    { "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" },
                    { "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "address", "name": "staker", "type": "address" },
                    { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
                ],
                "name": "getStakeDelegatedToPoolByOwner",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
                            { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
                            { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
                        ],
                        "internalType": "struct IStructs.StoredBalance",
                        "name": "balance",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "getStakingPool",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "address", "name": "operator", "type": "address" },
                            { "internalType": "uint32", "name": "operatorShare", "type": "uint32" }
                        ],
                        "internalType": "struct IStructs.Pool",
                        "name": "",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "getStakingPoolStatsThisEpoch",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint256", "name": "feesCollected", "type": "uint256" },
                            { "internalType": "uint256", "name": "weightedStake", "type": "uint256" },
                            { "internalType": "uint256", "name": "membersStake", "type": "uint256" }
                        ],
                        "internalType": "struct IStructs.PoolStats",
                        "name": "",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address", "name": "staker", "type": "address" }],
                "name": "getTotalStake",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "getTotalStakeDelegatedToPool",
                "outputs": [
                    {
                        "components": [
                            { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" },
                            { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" },
                            { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" }
                        ],
                        "internalType": "struct IStructs.StoredBalance",
                        "name": "balance",
                        "type": "tuple"
                    }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getWethContract",
                "outputs": [{ "internalType": "contract IEtherToken", "name": "wethContract", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "getZrxVault",
                "outputs": [{ "internalType": "contract IZrxVault", "name": "zrxVault", "type": "address" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [],
                "name": "init",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "joinStakingPoolAsMaker",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "lastPoolId",
                "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "minimumPoolStake",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    {
                        "components": [
                            { "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" },
                            { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
                        ],
                        "internalType": "struct IStructs.StakeInfo",
                        "name": "from",
                        "type": "tuple"
                    },
                    {
                        "components": [
                            { "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" },
                            { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }
                        ],
                        "internalType": "struct IStructs.StakeInfo",
                        "name": "to",
                        "type": "tuple"
                    },
                    { "internalType": "uint256", "name": "amount", "type": "uint256" }
                ],
                "name": "moveStake",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "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": "makerAddress", "type": "address" },
                    { "internalType": "address", "name": "payerAddress", "type": "address" },
                    { "internalType": "uint256", "name": "protocolFee", "type": "uint256" }
                ],
                "name": "payProtocolFee",
                "outputs": [],
                "payable": true,
                "stateMutability": "payable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "name": "poolIdByMaker",
                "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [
                    { "internalType": "bytes32", "name": "", "type": "bytes32" },
                    { "internalType": "uint256", "name": "", "type": "uint256" }
                ],
                "name": "poolStatsByEpoch",
                "outputs": [
                    { "internalType": "uint256", "name": "feesCollected", "type": "uint256" },
                    { "internalType": "uint256", "name": "weightedStake", "type": "uint256" },
                    { "internalType": "uint256", "name": "membersStake", "type": "uint256" }
                ],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "target", "type": "address" }],
                "name": "removeAuthorizedAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "address", "name": "target", "type": "address" },
                    { "internalType": "uint256", "name": "index", "type": "uint256" }
                ],
                "name": "removeAuthorizedAddressAtIndex",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }],
                "name": "removeExchangeAddress",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "rewardDelegatedStakeWeight",
                "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
                "name": "rewardsByPoolId",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [
                    { "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" },
                    { "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" },
                    { "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" },
                    { "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" },
                    { "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" }
                ],
                "name": "setParams",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }],
                "name": "stake",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "stakingContract",
                "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": "uint256", "name": "amount", "type": "uint256" }],
                "name": "unstake",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [{ "internalType": "address", "name": "", "type": "address" }],
                "name": "validExchanges",
                "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": true,
                "inputs": [],
                "name": "wethReservedForPoolRewards",
                "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
                "payable": false,
                "stateMutability": "view",
                "type": "function"
            },
            {
                "constant": false,
                "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }],
                "name": "withdrawDelegatorRewards",
                "outputs": [],
                "payable": false,
                "stateMutability": "nonpayable",
                "type": "function"
            }
        ],
        "devdoc": {
            "methods": {
                "addAuthorizedAddress(address)": {
                    "details": "Authorizes an address.",
                    "params": { "target": "Address to authorize." }
                },
                "addExchangeAddress(address)": {
                    "details": "Adds a new exchange address",
                    "params": { "addr": "Address of exchange contract to add" }
                },
                "computeRewardBalanceOfDelegator(bytes32,address)": {
                    "details": "Computes the reward balance in ETH of a specific member of a pool.",
                    "params": { "member": "The member of the pool.", "poolId": "Unique id of pool." },
                    "return": "totalReward Balance in ETH."
                },
                "computeRewardBalanceOfOperator(bytes32)": {
                    "details": "Computes the reward balance in ETH of the operator of a pool.",
                    "params": { "poolId": "Unique id of pool." },
                    "return": "totalReward Balance in ETH."
                },
                "createStakingPool(uint32,bool)": {
                    "details": "Create a new staking pool. The sender will be the operator of this pool. Note that an operator must be payable.",
                    "params": {
                        "addOperatorAsMaker": "Adds operator to the created pool as a maker for convenience iff true.",
                        "operatorShare": "Portion of rewards owned by the operator, in ppm."
                    },
                    "return": "poolId The unique pool id generated for this pool."
                },
                "decreaseStakingPoolOperatorShare(bytes32,uint32)": {
                    "details": "Decreases the operator share for the given pool (i.e. increases pool rewards for members).",
                    "params": {
                        "newOperatorShare": "The newly decreased percentage of any rewards owned by the operator.",
                        "poolId": "Unique Id of pool."
                    }
                },
                "endEpoch()": {
                    "details": "Begins a new epoch, preparing the prior one for finalization.      Throws if not enough time has passed between epochs or if the      previous epoch was not fully finalized.",
                    "return": "numPoolsToFinalize The number of unfinalized pools."
                },
                "finalizePool(bytes32)": {
                    "details": "Instantly finalizes a single pool that earned rewards in the previous      epoch, crediting it rewards for members and withdrawing operator's      rewards as WETH. This can be called by internal functions that need      to finalize a pool immediately. Does nothing if the pool is already      finalized or did not earn rewards in the previous epoch.",
                    "params": { "poolId": "The pool ID to finalize." }
                },
                "getAuthorizedAddresses()": {
                    "details": "Gets all authorized addresses.",
                    "return": "Array of authorized addresses."
                },
                "getCurrentEpochEarliestEndTimeInSeconds()": {
                    "details": "Returns the earliest end time in seconds of this epoch.      The next epoch can begin once this time is reached.      Epoch period = [startTimeInSeconds..endTimeInSeconds)",
                    "return": "Time in seconds."
                },
                "getGlobalStakeByStatus(uint8)": {
                    "details": "Gets global stake for a given status.",
                    "params": { "stakeStatus": "UNDELEGATED or DELEGATED" },
                    "return": "Global stake for given status."
                },
                "getOwnerStakeByStatus(address,uint8)": {
                    "details": "Gets an owner's stake balances by status.",
                    "params": { "stakeStatus": "UNDELEGATED or DELEGATED", "staker": "Owner of stake." },
                    "return": "Owner's stake balances for given status."
                },
                "getParams()": {
                    "details": "Retrieves all configurable parameter values.",
                    "return": "_epochDurationInSeconds Minimum seconds between epochs._rewardDelegatedStakeWeight How much delegated stake is weighted vs operator stake, in ppm._minimumPoolStake Minimum amount of stake required in a pool to collect rewards._cobbDouglasAlphaNumerator Numerator for cobb douglas alpha factor._cobbDouglasAlphaDenominator Denominator for cobb douglas alpha factor."
                },
                "getStakeDelegatedToPoolByOwner(address,bytes32)": {
                    "details": "Returns the stake delegated to a specific staking pool, by a given staker.",
                    "params": { "poolId": "Unique Id of pool.", "staker": "of stake." },
                    "return": "Stake delegated to pool by staker."
                },
                "getStakingPool(bytes32)": {
                    "details": "Returns a staking pool",
                    "params": { "poolId": "Unique id of pool." }
                },
                "getStakingPoolStatsThisEpoch(bytes32)": {
                    "details": "Get stats on a staking pool in this epoch.",
                    "params": { "poolId": "Pool Id to query." },
                    "return": "PoolStats struct for pool id."
                },
                "getTotalStake(address)": {
                    "details": "Returns the total stake for a given staker.",
                    "params": { "staker": "of stake." },
                    "return": "Total ZRX staked by `staker`."
                },
                "getTotalStakeDelegatedToPool(bytes32)": {
                    "details": "Returns the total stake delegated to a specific staking pool,      across all members.",
                    "params": { "poolId": "Unique Id of pool." },
                    "return": "Total stake delegated to pool."
                },
                "getWethContract()": {
                    "details": "An overridable way to access the deployed WETH contract.      Must be view to allow overrides to access state.",
                    "return": "wethContract The WETH contract instance."
                },
                "getZrxVault()": {
                    "details": "An overridable way to access the deployed zrxVault.      Must be view to allow overrides to access state.",
                    "return": "zrxVault The zrxVault contract."
                },
                "init()": {
                    "details": "Initialize storage owned by this contract.      This function should not be called directly.      The StakingProxy contract will call it in `attachStakingContract()`."
                },
                "joinStakingPoolAsMaker(bytes32)": {
                    "details": "Allows caller to join a staking pool as a maker.",
                    "params": { "poolId": "Unique id of pool." }
                },
                "moveStake((uint8,bytes32),(uint8,bytes32),uint256)": {
                    "details": "Moves stake between statuses: 'undelegated' or 'delegated'.      Delegated stake can also be moved between pools.      This change comes into effect next epoch.",
                    "params": {
                        "amount": "Amount of stake to move.",
                        "from": "Status to move stake out of.",
                        "to": "Status to move stake into."
                    }
                },
                "payProtocolFee(address,address,uint256)": {
                    "details": "Pays a protocol fee in ETH or WETH.      Only a known 0x exchange can call this method. See      (MixinExchangeManager).",
                    "params": {
                        "makerAddress": "The address of the order's maker.",
                        "payerAddress": "The address of the protocol fee payer.",
                        "protocolFee": "The protocol fee amount. This is either passed as ETH or transferred as WETH."
                    }
                },
                "removeAuthorizedAddress(address)": {
                    "details": "Removes authorizion of an address.",
                    "params": { "target": "Address to remove authorization from." }
                },
                "removeAuthorizedAddressAtIndex(address,uint256)": {
                    "details": "Removes authorizion of an address.",
                    "params": {
                        "index": "Index of target in authorities array.",
                        "target": "Address to remove authorization from."
                    }
                },
                "removeExchangeAddress(address)": {
                    "details": "Removes an existing exchange address",
                    "params": { "addr": "Address of exchange contract to remove" }
                },
                "setParams(uint256,uint32,uint256,uint32,uint32)": {
                    "details": "Set all configurable parameters at once.",
                    "params": {
                        "_cobbDouglasAlphaDenominator": "Denominator for cobb douglas alpha factor.",
                        "_cobbDouglasAlphaNumerator": "Numerator for cobb douglas alpha factor.",
                        "_epochDurationInSeconds": "Minimum seconds between epochs.",
                        "_minimumPoolStake": "Minimum amount of stake required in a pool to collect rewards.",
                        "_rewardDelegatedStakeWeight": "How much delegated stake is weighted vs operator stake, in ppm."
                    }
                },
                "stake(uint256)": {
                    "details": "Stake ZRX tokens. Tokens are deposited into the ZRX Vault.      Unstake to retrieve the ZRX. Stake is in the 'Active' status.",
                    "params": { "amount": "Amount of ZRX to stake." }
                },
                "transferOwnership(address)": {
                    "details": "Change the owner of this contract.",
                    "params": { "newOwner": "New owner address." }
                },
                "unstake(uint256)": {
                    "details": "Unstake. Tokens are withdrawn from the ZRX Vault and returned to      the staker. Stake must be in the 'undelegated' status in both the      current and next epoch in order to be unstaked.",
                    "params": { "amount": "Amount of ZRX to unstake." }
                },
                "withdrawDelegatorRewards(bytes32)": {
                    "details": "Withdraws the caller's WETH rewards that have accumulated      until the last epoch.",
                    "params": { "poolId": "Unique id of pool." }
                }
            }
        },
        "evm": {
            "bytecode": {
                "object": "[encoded data, 44474 characters]"
            },
            "deployedBytecode": {
                "object": "[encoded data, 44400 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": "istanbul"
        }
    },
    "chains": {}
}
