{
  "address": "0x89EcDDa0d98b796e1bb93A578E0559509A033F00",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "_rewardToken",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "_lpToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_tokenPerSec",
          "type": "uint256"
        },
        {
          "internalType": "contract IMasterChefJoe",
          "name": "_MCJ",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_isNative",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "OnReward",
      "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": "oldRate",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "newRate",
          "type": "uint256"
        }
      ],
      "name": "RewardRateUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MCJ",
      "outputs": [
        {
          "internalType": "contract IMasterChefJoe",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "balance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "claimOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "emergencyWithdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isNative",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lpToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_lpAmount",
          "type": "uint256"
        }
      ],
      "name": "onJoeReward",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        }
      ],
      "name": "pendingTokens",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "pending",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "poolInfo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "accTokenPerShare",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastRewardTimestamp",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_tokenPerSec",
          "type": "uint256"
        }
      ],
      "name": "setRewardRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenPerSec",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "direct",
          "type": "bool"
        },
        {
          "internalType": "bool",
          "name": "renounce",
          "type": "bool"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "updatePool",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "accTokenPerShare",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastRewardTimestamp",
              "type": "uint256"
            }
          ],
          "internalType": "struct SimpleRewarderPerSec.PoolInfo",
          "name": "pool",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "userInfo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "rewardDebt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "unpaidRewards",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "transactionHash": "0xf643dbeff10b82c449ae6c90b9208f546b230dfd49d3281b5131256089f5d278",
  "receipt": {
    "to": null,
    "from": "0x5D3e4C0FE11e0aE4c32F0FF74B4544C49538AC61",
    "contractAddress": "0x89EcDDa0d98b796e1bb93A578E0559509A033F00",
    "transactionIndex": 0,
    "gasUsed": "1326005",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000800000020000000000000000000800040000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000004000080000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x12bcd43cbd7d50bdce7a1c323be44f2f837beaae8c374b590ed3a097b9cbd5f0",
    "transactionHash": "0xf643dbeff10b82c449ae6c90b9208f546b230dfd49d3281b5131256089f5d278",
    "logs": [
      {
        "transactionIndex": 0,
        "blockNumber": 8699258,
        "transactionHash": "0xf643dbeff10b82c449ae6c90b9208f546b230dfd49d3281b5131256089f5d278",
        "address": "0x89EcDDa0d98b796e1bb93A578E0559509A033F00",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x0000000000000000000000005d3e4c0fe11e0ae4c32f0ff74b4544c49538ac61"
        ],
        "data": "0x",
        "logIndex": 0,
        "blockHash": "0x12bcd43cbd7d50bdce7a1c323be44f2f837beaae8c374b590ed3a097b9cbd5f0"
      }
    ],
    "blockNumber": 8699258,
    "cumulativeGasUsed": "1326005",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7",
    "0xb97F23A9e289B5F5e8732b6e20df087977AcC434",
    "0",
    "0x188bED1968b795d5c9022F6a0bb5931Ac4c18F00",
    true
  ],
  "solcInputHash": "8932de5fc1e2ef5cc003845187d87219",
  "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenPerSec\",\"type\":\"uint256\"},{\"internalType\":\"contract IMasterChefJoe\",\"name\":\"_MCJ\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isNative\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"OnReward\",\"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\":\"oldRate\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newRate\",\"type\":\"uint256\"}],\"name\":\"RewardRateUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MCJ\",\"outputs\":[{\"internalType\":\"contract IMasterChefJoe\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isNative\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lpToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_lpAmount\",\"type\":\"uint256\"}],\"name\":\"onJoeReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingTokens\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"accTokenPerShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenPerSec\",\"type\":\"uint256\"}],\"name\":\"setRewardRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenPerSec\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updatePool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"accTokenPerShare\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardTimestamp\",\"type\":\"uint256\"}],\"internalType\":\"struct SimpleRewarderPerSec.PoolInfo\",\"name\":\"pool\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardDebt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unpaidRewards\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"onJoeReward(address,uint256)\":{\"params\":{\"_lpAmount\":\"Number of LP tokens the user has\",\"_user\":\"Address of user\"}},\"pendingTokens(address)\":{\"params\":{\"_user\":\"Address of user.\"},\"returns\":{\"pending\":\"reward for a given user.\"}},\"setRewardRate(uint256)\":{\"params\":{\"_tokenPerSec\":\"The number of tokens to distribute per second\"}},\"transferOwnership(address,bool,bool)\":{\"params\":{\"direct\":\"True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\",\"newOwner\":\"Address of the new owner.\",\"renounce\":\"Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\"}},\"updatePool()\":{\"returns\":{\"pool\":\"Returns the pool that was updated.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balance()\":{\"notice\":\"View function to see balance of reward token.\"},\"claimOwnership()\":{\"notice\":\"Needs to be called by `pendingOwner` to claim ownership.\"},\"emergencyWithdraw()\":{\"notice\":\"In case rewarder is stopped before emissions finished, this function allows withdrawal of remaining tokens.\"},\"onJoeReward(address,uint256)\":{\"notice\":\"Function called by MasterChefJoe whenever staker claims JOE harvest. Allows staker to also receive a 2nd reward token.\"},\"pendingTokens(address)\":{\"notice\":\"View function to see pending tokens\"},\"poolInfo()\":{\"notice\":\"Info of the poolInfo.\"},\"setRewardRate(uint256)\":{\"notice\":\"Sets the distribution reward rate. This will also update the poolInfo.\"},\"transferOwnership(address,bool,bool)\":{\"notice\":\"Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`.\"},\"updatePool()\":{\"notice\":\"Update reward variables of the given poolInfo.\"},\"userInfo(address)\":{\"notice\":\"Info of each user that stakes LP tokens.\"}},\"notice\":\"This is a sample contract to be used in the MasterChefJoe contract for partners to reward stakers with their native token alongside JOE. It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior. E.g. say you've allocated 100,000 XYZ to the JOE-XYZ farm over 30 days. Then you would need to transfer 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/rewarders/SimpleRewarderPerSec.sol\":\"SimpleRewarderPerSec\"},\"evmVersion\":\"istanbul\",\"libraries\":{\"__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/math/SafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMath {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xcc78a17dd88fa5a2edc60c8489e2f405c0913b377216a5b26b35656b2d0dab52\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x28911e614500ae7c607a432a709d35da25f3bc5ddc8bd12b278b66358070c0ea\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    constructor () internal {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x8bbbc2f5c10065ee272592ae0a7a6ceb23de2fbd81564ee0bb015ecf404d5f61\",\"license\":\"MIT\"},\"contracts/boringcrypto/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\n\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\n// Edited by BoringCrypto\\n\\ncontract BoringOwnableData {\\n    address public owner;\\n    address public pendingOwner;\\n}\\n\\ncontract BoringOwnable is BoringOwnableData {\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /// @notice `owner` defaults to msg.sender on construction.\\n    constructor() public {\\n        owner = msg.sender;\\n        emit OwnershipTransferred(address(0), msg.sender);\\n    }\\n\\n    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.\\n    /// Can only be invoked by the current `owner`.\\n    /// @param newOwner Address of the new owner.\\n    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.\\n    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.\\n    function transferOwnership(\\n        address newOwner,\\n        bool direct,\\n        bool renounce\\n    ) public onlyOwner {\\n        if (direct) {\\n            // Checks\\n            require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\n\\n            // Effects\\n            emit OwnershipTransferred(owner, newOwner);\\n            owner = newOwner;\\n            pendingOwner = address(0);\\n        } else {\\n            // Effects\\n            pendingOwner = newOwner;\\n        }\\n    }\\n\\n    /// @notice Needs to be called by `pendingOwner` to claim ownership.\\n    function claimOwnership() public {\\n        address _pendingOwner = pendingOwner;\\n\\n        // Checks\\n        require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\n\\n        // Effects\\n        emit OwnershipTransferred(owner, _pendingOwner);\\n        owner = _pendingOwner;\\n        pendingOwner = address(0);\\n    }\\n\\n    /// @notice Only allows the `owner` to execute the function.\\n    modifier onlyOwner() {\\n        require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n}\\n\",\"keccak256\":\"0xbde1619421fef865bf5f5f806e319900fb862e27f0aef6e0878e93f04f477601\",\"license\":\"MIT\"},\"contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\n\\ninterface IERC20 {\\n    function totalSupply() external view returns (uint256);\\n\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n    // EIP 2612\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n}\\n\",\"keccak256\":\"0xa3fb82796e80f566a5c47f9a1f2ade7de7f390dfdc06bea5375112b9f9314f40\",\"license\":\"MIT\"},\"contracts/libraries/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\n\\nimport \\\"../interfaces/IERC20.sol\\\";\\n\\nlibrary SafeERC20 {\\n    function safeSymbol(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\n        return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\n    }\\n\\n    function safeName(IERC20 token) internal view returns (string memory) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\n        return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\n    }\\n\\n    function safeDecimals(IERC20 token) public view returns (uint8) {\\n        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\n        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\n    }\\n\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"SafeERC20: Transfer failed\\\");\\n    }\\n\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        uint256 amount\\n    ) internal {\\n        (bool success, bytes memory data) = address(token).call(\\n            abi.encodeWithSelector(0x23b872dd, from, address(this), amount)\\n        );\\n        require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"SafeERC20: TransferFrom failed\\\");\\n    }\\n}\\n\",\"keccak256\":\"0x99e81ec6f2ea77a913daabf49fe5cb8c83a0969e26793fc07a06881157b32646\",\"license\":\"MIT\"},\"contracts/rewarders/SimpleRewarderPerSec.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts/math/SafeMath.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\\\";\\nimport \\\"../boringcrypto/BoringOwnable.sol\\\";\\nimport \\\"../libraries/SafeERC20.sol\\\";\\n\\ninterface IRewarder {\\n    using SafeERC20 for IERC20;\\n\\n    function onJoeReward(address user, uint256 newLpAmount) external;\\n\\n    function pendingTokens(address user) external view returns (uint256 pending);\\n\\n    function rewardToken() external view returns (IERC20);\\n}\\n\\ninterface IMasterChefJoe {\\n    using SafeERC20 for IERC20;\\n\\n    struct UserInfo {\\n        uint256 amount; // How many LP tokens the user has provided.\\n        uint256 rewardDebt; // Reward debt. See explanation below.\\n    }\\n\\n    struct PoolInfo {\\n        IERC20 lpToken; // Address of LP token contract.\\n        uint256 allocPoint; // How many allocation points assigned to this poolInfo. SUSHI to distribute per block.\\n        uint256 lastRewardTimestamp; // Last block timestamp that SUSHI distribution occurs.\\n        uint256 accJoePerShare; // Accumulated SUSHI per share, times 1e12. See below.\\n    }\\n\\n    function poolInfo(uint256 pid) external view returns (PoolInfo memory);\\n\\n    function totalAllocPoint() external view returns (uint256);\\n\\n    function deposit(uint256 _pid, uint256 _amount) external;\\n}\\n\\n/**\\n * This is a sample contract to be used in the MasterChefJoe contract for partners to reward\\n * stakers with their native token alongside JOE.\\n *\\n * It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior.\\n * E.g. say you've allocated 100,000 XYZ to the JOE-XYZ farm over 30 days. Then you would need to transfer\\n * 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days.\\n *\\n */\\ncontract SimpleRewarderPerSec is IRewarder, BoringOwnable, ReentrancyGuard {\\n    using SafeMath for uint256;\\n    using SafeERC20 for IERC20;\\n\\n    IERC20 public immutable override rewardToken;\\n    IERC20 public immutable lpToken;\\n    bool public immutable isNative;\\n    IMasterChefJoe public immutable MCJ;\\n\\n    /// @notice Info of each MCJ user.\\n    /// `amount` LP token amount the user has provided.\\n    /// `rewardDebt` The amount of YOUR_TOKEN entitled to the user.\\n    struct UserInfo {\\n        uint256 amount;\\n        uint256 rewardDebt;\\n        uint256 unpaidRewards;\\n    }\\n\\n    /// @notice Info of each MCJ poolInfo.\\n    /// `accTokenPerShare` Amount of YOUR_TOKEN each LP token is worth.\\n    /// `lastRewardTimestamp` The last timestamp YOUR_TOKEN was rewarded to the poolInfo.\\n    struct PoolInfo {\\n        uint256 accTokenPerShare;\\n        uint256 lastRewardTimestamp;\\n    }\\n\\n    /// @notice Info of the poolInfo.\\n    PoolInfo public poolInfo;\\n    /// @notice Info of each user that stakes LP tokens.\\n    mapping(address => UserInfo) public userInfo;\\n\\n    uint256 public tokenPerSec;\\n    uint256 private constant ACC_TOKEN_PRECISION = 1e12;\\n\\n    event OnReward(address indexed user, uint256 amount);\\n    event RewardRateUpdated(uint256 oldRate, uint256 newRate);\\n\\n    modifier onlyMCJ() {\\n        require(msg.sender == address(MCJ), \\\"onlyMCJ: only MasterChefJoe can call this function\\\");\\n        _;\\n    }\\n\\n    constructor(\\n        IERC20 _rewardToken,\\n        IERC20 _lpToken,\\n        uint256 _tokenPerSec,\\n        IMasterChefJoe _MCJ,\\n        bool _isNative\\n    ) public {\\n        require(Address.isContract(address(_rewardToken)), \\\"constructor: reward token must be a valid contract\\\");\\n        require(Address.isContract(address(_lpToken)), \\\"constructor: LP token must be a valid contract\\\");\\n        require(Address.isContract(address(_MCJ)), \\\"constructor: MasterChefJoe must be a valid contract\\\");\\n\\n        rewardToken = _rewardToken;\\n        lpToken = _lpToken;\\n        tokenPerSec = _tokenPerSec;\\n        MCJ = _MCJ;\\n        isNative = _isNative;\\n        poolInfo = PoolInfo({lastRewardTimestamp: block.timestamp, accTokenPerShare: 0});\\n    }\\n\\n    /// @notice Update reward variables of the given poolInfo.\\n    /// @return pool Returns the pool that was updated.\\n    function updatePool() public returns (PoolInfo memory pool) {\\n        pool = poolInfo;\\n\\n        if (block.timestamp > pool.lastRewardTimestamp) {\\n            uint256 lpSupply = lpToken.balanceOf(address(MCJ));\\n\\n            if (lpSupply > 0) {\\n                uint256 timeElapsed = block.timestamp.sub(pool.lastRewardTimestamp);\\n                uint256 tokenReward = timeElapsed.mul(tokenPerSec);\\n                pool.accTokenPerShare = pool.accTokenPerShare.add((tokenReward.mul(ACC_TOKEN_PRECISION) / lpSupply));\\n            }\\n\\n            pool.lastRewardTimestamp = block.timestamp;\\n            poolInfo = pool;\\n        }\\n    }\\n\\n    /// @notice Sets the distribution reward rate. This will also update the poolInfo.\\n    /// @param _tokenPerSec The number of tokens to distribute per second\\n    function setRewardRate(uint256 _tokenPerSec) external onlyOwner {\\n        updatePool();\\n\\n        uint256 oldRate = tokenPerSec;\\n        tokenPerSec = _tokenPerSec;\\n\\n        emit RewardRateUpdated(oldRate, _tokenPerSec);\\n    }\\n\\n    /// @notice Function called by MasterChefJoe whenever staker claims JOE harvest. Allows staker to also receive a 2nd reward token.\\n    /// @param _user Address of user\\n    /// @param _lpAmount Number of LP tokens the user has\\n    function onJoeReward(address _user, uint256 _lpAmount) external override onlyMCJ nonReentrant {\\n        updatePool();\\n        PoolInfo memory pool = poolInfo;\\n        UserInfo storage user = userInfo[_user];\\n        uint256 pending;\\n        if (user.amount > 0) {\\n            pending = (user.amount.mul(pool.accTokenPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt).add(\\n                user.unpaidRewards\\n            );\\n\\n            if (isNative) {\\n                uint256 balance = address(this).balance;\\n                if (pending > balance) {\\n                    (bool success, ) = _user.call.value(balance)(\\\"\\\");\\n                    require(success, \\\"Transfer failed\\\");\\n                    user.unpaidRewards = pending - balance;\\n                } else {\\n                    (bool success, ) = _user.call.value(pending)(\\\"\\\");\\n                    require(success, \\\"Transfer failed\\\");\\n                    user.unpaidRewards = 0;\\n                }\\n            } else {\\n                uint256 balance = rewardToken.balanceOf(address(this));\\n                if (pending > balance) {\\n                    rewardToken.safeTransfer(_user, balance);\\n                    user.unpaidRewards = pending - balance;\\n                } else {\\n                    rewardToken.safeTransfer(_user, pending);\\n                    user.unpaidRewards = 0;\\n                }\\n            }\\n        }\\n\\n        user.amount = _lpAmount;\\n        user.rewardDebt = user.amount.mul(pool.accTokenPerShare) / ACC_TOKEN_PRECISION;\\n        emit OnReward(_user, pending - user.unpaidRewards);\\n    }\\n\\n    /// @notice View function to see pending tokens\\n    /// @param _user Address of user.\\n    /// @return pending reward for a given user.\\n    function pendingTokens(address _user) external view override returns (uint256 pending) {\\n        PoolInfo memory pool = poolInfo;\\n        UserInfo storage user = userInfo[_user];\\n\\n        uint256 accTokenPerShare = pool.accTokenPerShare;\\n        uint256 lpSupply = lpToken.balanceOf(address(MCJ));\\n\\n        if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {\\n            uint256 timeElapsed = block.timestamp.sub(pool.lastRewardTimestamp);\\n            uint256 tokenReward = timeElapsed.mul(tokenPerSec);\\n            accTokenPerShare = accTokenPerShare.add(tokenReward.mul(ACC_TOKEN_PRECISION).div(lpSupply));\\n        }\\n\\n        pending = (user.amount.mul(accTokenPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt).add(\\n            user.unpaidRewards\\n        );\\n    }\\n\\n    /// @notice In case rewarder is stopped before emissions finished, this function allows\\n    /// withdrawal of remaining tokens.\\n    function emergencyWithdraw() public onlyOwner {\\n        if (isNative) {\\n            (bool success, ) = msg.sender.call.value(address(this).balance)(\\\"\\\");\\n            require(success, \\\"Transfer failed\\\");\\n        } else {\\n            rewardToken.safeTransfer(address(msg.sender), rewardToken.balanceOf(address(this)));\\n        }\\n    }\\n\\n    /// @notice View function to see balance of reward token.\\n    function balance() external view returns (uint256) {\\n        if (isNative) {\\n            return address(this).balance;\\n        } else {\\n            return rewardToken.balanceOf(address(this));\\n        }\\n    }\\n\\n    /// @notice payable function needed to receive AVAX\\n    receive() external payable {}\\n}\\n\",\"keccak256\":\"0xeccaac9b4b3a4aba553095fd8e45b520f5dfe53658ef01939ec21aff5da26731\",\"license\":\"GPL-3.0\"}},\"version\":1}",
  "bytecode": "0x6101006040523480156200001257600080fd5b50604051620018fc380380620018fc83398101604081905262000035916200017f565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600160028190555062000092856200017960201b62000f3d1760201c565b620000ba5760405162461bcd60e51b8152600401620000b190620001f5565b60405180910390fd5b620000d0846200017960201b62000f3d1760201c565b620000ef5760405162461bcd60e51b8152600401620000b19062000247565b62000105826200017960201b62000f3d1760201c565b620001245760405162461bcd60e51b8152600401620000b19062000295565b6001600160601b0319606095861b811660805293851b841660a05260069290925590921b1660e052151560f81b60c052604080518082019091526000808252426020929092018290526003556004556200030b565b3b151590565b600080600080600060a0868803121562000197578081fd5b8551620001a481620002f2565b6020870151909550620001b781620002f2565b604087015160608801519195509350620001d181620002f2565b60808701519092508015158114620001e7578182fd5b809150509295509295909350565b60208082526032908201527f636f6e7374727563746f723a2072657761726420746f6b656e206d7573742062604082015271194818481d985b1a590818dbdb9d1c9858dd60721b606082015260800190565b6020808252602e908201527f636f6e7374727563746f723a204c5020746f6b656e206d75737420626520612060408201526d1d985b1a590818dbdb9d1c9858dd60921b606082015260800190565b60208082526033908201527f636f6e7374727563746f723a204d6173746572436865664a6f65206d7573742060408201527f626520612076616c696420636f6e747261637400000000000000000000000000606082015260800190565b6001600160a01b03811681146200030857600080fd5b50565b60805160601c60a05160601c60c05160f81c60e05160601c611569620003936000398061042152806108005280610ae25280610e2852508061051b52806108e452806109925280610c305250806108c05280610ab35280610dfb5250806106775280610713528061075452806109d45280610cdc5280610d805280610f1b52506115696000f3fe6080604052600436106101025760003560e01c806373cfc6b211610095578063c031a66f11610064578063c031a66f14610285578063db2e21bc146102a5578063e30c3978146102ba578063e3161ddd146102cf578063f7c618c1146102f157610109565b806373cfc6b2146102195780638da5cb5b1461023b5780639e447fc614610250578063b69ef8a81461027057610109565b80634e71e0c8116100d15780634e71e0c8146101aa57806350fd1f3e146101bf5780635a2f3d09146101e15780635fcbd2851461020457610109565b8063078dfbe71461010e5780631959a002146101305780631a7af8b01461016857806330628e151461018857610109565b3661010957005b600080fd5b34801561011a57600080fd5b5061012e610129366004611146565b610306565b005b34801561013c57600080fd5b5061015061014b366004611124565b6103f5565b60405161015f9392919061150c565b60405180910390f35b34801561017457600080fd5b5061012e61018336600461118f565b610416565b34801561019457600080fd5b5061019d6107fe565b60405161015f919061123e565b3480156101b657600080fd5b5061012e610822565b3480156101cb57600080fd5b506101d46108af565b60405161015f91906114f5565b3480156101ed57600080fd5b506101f66108b5565b60405161015f9291906114fe565b34801561021057600080fd5b5061019d6108be565b34801561022557600080fd5b5061022e6108e2565b60405161015f919061126b565b34801561024757600080fd5b5061019d610906565b34801561025c57600080fd5b5061012e61026b3660046111d5565b610915565b34801561027c57600080fd5b506101d461098e565b34801561029157600080fd5b506101d46102a0366004611124565b610a5f565b3480156102b157600080fd5b5061012e610c04565b3480156102c657600080fd5b5061019d610da9565b3480156102db57600080fd5b506102e4610db8565b60405161015f91906114de565b3480156102fd57600080fd5b5061019d610f19565b6000546001600160a01b031633146103395760405162461bcd60e51b8152600401610330906113b4565b60405180910390fd5b81156103d4576001600160a01b0383161515806103535750805b61036f5760405162461bcd60e51b8152600401610330906112d6565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b0319918216179091556001805490911690556103f0565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60056020526000908152604090208054600182015460029092015490919083565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461045e5760405162461bcd60e51b815260040161033090611455565b6002805414156104805760405162461bcd60e51b8152600401610330906114a7565b6002805561048c610db8565b506104956110f3565b5060408051808201825260035481526004546020808301919091526001600160a01b0385166000908152600590915291822080549192909115610785576105178260020154610511846001015464e8d4a5100061050388600001518860000154610f4390919063ffffffff16565b8161050a57fe5b0490610f86565b90610fae565b90507f00000000000000000000000000000000000000000000000000000000000000001561065d5747808211156105d2576000866001600160a01b03168260405161056190610a5c565b60006040518083038185875af1925050503d806000811461059e576040519150601f19603f3d011682016040523d82523d6000602084013e6105a3565b606091505b50509050806105c45760405162461bcd60e51b815260040161033090611276565b508082036002840155610657565b6000866001600160a01b0316836040516105eb90610a5c565b60006040518083038185875af1925050503d8060008114610628576040519150601f19603f3d011682016040523d82523d6000602084013e61062d565b606091505b505090508061064e5760405162461bcd60e51b815260040161033090611276565b50600060028401555b50610785565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906106ac90309060040161123e565b60206040518083038186803b1580156106c457600080fd5b505afa1580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fc91906111ed565b9050808211156107475761073a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610fd3565b8082036002840155610783565b61077b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168784610fd3565b600060028401555b505b838255825164e8d4a510009061079c908690610f43565b816107a357fe5b04600183015560028201546040516001600160a01b038716917fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b4916107ea918503906114f5565b60405180910390a250506001600255505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633811461084d5760405162461bcd60e51b8152600401610330906113e9565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60065481565b60035460045482565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b6000546001600160a01b0316331461093f5760405162461bcd60e51b8152600401610330906113b4565b610947610db8565b5060068054908290556040517fc390a98ace15a7bb6bab611eedfdbb2685043b241a869420043cdfb23ccfee509061098290839085906114fe565b60405180910390a15050565b60007f0000000000000000000000000000000000000000000000000000000000000000156109bd575047610a5c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610a0990309060040161123e565b60206040518083038186803b158015610a2157600080fd5b505afa158015610a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5991906111ed565b90505b90565b6000610a696110f3565b506040805180820182526003548152600480546020808401919091526001600160a01b0380871660009081526005909252848220845195516370a0823160e01b81529495909490937f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191610b08917f0000000000000000000000000000000000000000000000000000000000000000910161123e565b60206040518083038186803b158015610b2057600080fd5b505afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5891906111ed565b9050836020015142118015610b6c57508015155b15610bcd576000610b8a856020015142610f8690919063ffffffff16565b90506000610ba360065483610f4390919063ffffffff16565b9050610bc8610bc184610bbb8464e8d4a51000610f43565b906110c1565b8590610fae565b935050505b610bfa8360020154610511856001015464e8d4a51000610503878960000154610f4390919063ffffffff16565b9695505050505050565b6000546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610330906113b4565b7f000000000000000000000000000000000000000000000000000000000000000015610cd6576000336001600160a01b031647604051610c6d90610a5c565b60006040518083038185875af1925050503d8060008114610caa576040519150601f19603f3d011682016040523d82523d6000602084013e610caf565b606091505b5050905080610cd05760405162461bcd60e51b815260040161033090611276565b50610da7565b610da7337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610d26919061123e565b60206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7691906111ed565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190610fd3565b565b6001546001600160a01b031681565b610dc06110f3565b5060408051808201909152600354815260045460208201819052421115610a5c576040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610e50907f00000000000000000000000000000000000000000000000000000000000000009060040161123e565b60206040518083038186803b158015610e6857600080fd5b505afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea091906111ed565b90508015610f05576000610ec1836020015142610f8690919063ffffffff16565b90506000610eda60065483610f4390919063ffffffff16565b9050610f0083610eef8364e8d4a51000610f43565b81610ef657fe5b8651919004610fae565b845250505b504260208201819052815160035560045590565b7f000000000000000000000000000000000000000000000000000000000000000081565b3b151590565b600082610f5257506000610f80565b82820282848281610f5f57fe5b0414610f7d5760405162461bcd60e51b815260040161033090611373565b90505b92915050565b600082821115610fa85760405162461bcd60e51b815260040161033090611305565b50900390565b600082820183811015610f7d5760405162461bcd60e51b81526004016103309061129f565b60006060846001600160a01b031663a9059cbb8585604051602401610ff9929190611252565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516110329190611205565b6000604051808303816000865af19150503d806000811461106f576040519150601f19603f3d011682016040523d82523d6000602084013e611074565b606091505b509150915081801561109e57508051158061109e57508080602001905181019061109e91906111b9565b6110ba5760405162461bcd60e51b81526004016103309061141e565b5050505050565b60008082116110e25760405162461bcd60e51b81526004016103309061133c565b8183816110eb57fe5b049392505050565b604051806040016040528060008152602001600081525090565b80356001600160a01b0381168114610f8057600080fd5b600060208284031215611135578081fd5b61113f838361110d565b9392505050565b60008060006060848603121561115a578182fd5b611164858561110d565b9250602084013561117481611522565b9150604084013561118481611522565b809150509250925092565b600080604083850312156111a1578182fd5b6111ab848461110d565b946020939093013593505050565b6000602082840312156111ca578081fd5b8151610f7d81611522565b6000602082840312156111e6578081fd5b5035919050565b6000602082840312156111fe578081fd5b5051919050565b60008251815b81811015611225576020818601810151858301520161120b565b818111156112335782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601a908201527f5361666545524332303a205472616e73666572206661696c6564000000000000604082015260600190565b60208082526032908201527f6f6e6c794d434a3a206f6e6c79204d6173746572436865664a6f652063616e2060408201527131b0b636103a3434b990333ab731ba34b7b760711b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b801515811461153057600080fd5b5056fea26469706673582212204e43430a5e614eacf62e479da8d22e21b4a738b78ee0cefb156dc5fcd4e5e60f64736f6c634300060c0033",
  "deployedBytecode": "0x6080604052600436106101025760003560e01c806373cfc6b211610095578063c031a66f11610064578063c031a66f14610285578063db2e21bc146102a5578063e30c3978146102ba578063e3161ddd146102cf578063f7c618c1146102f157610109565b806373cfc6b2146102195780638da5cb5b1461023b5780639e447fc614610250578063b69ef8a81461027057610109565b80634e71e0c8116100d15780634e71e0c8146101aa57806350fd1f3e146101bf5780635a2f3d09146101e15780635fcbd2851461020457610109565b8063078dfbe71461010e5780631959a002146101305780631a7af8b01461016857806330628e151461018857610109565b3661010957005b600080fd5b34801561011a57600080fd5b5061012e610129366004611146565b610306565b005b34801561013c57600080fd5b5061015061014b366004611124565b6103f5565b60405161015f9392919061150c565b60405180910390f35b34801561017457600080fd5b5061012e61018336600461118f565b610416565b34801561019457600080fd5b5061019d6107fe565b60405161015f919061123e565b3480156101b657600080fd5b5061012e610822565b3480156101cb57600080fd5b506101d46108af565b60405161015f91906114f5565b3480156101ed57600080fd5b506101f66108b5565b60405161015f9291906114fe565b34801561021057600080fd5b5061019d6108be565b34801561022557600080fd5b5061022e6108e2565b60405161015f919061126b565b34801561024757600080fd5b5061019d610906565b34801561025c57600080fd5b5061012e61026b3660046111d5565b610915565b34801561027c57600080fd5b506101d461098e565b34801561029157600080fd5b506101d46102a0366004611124565b610a5f565b3480156102b157600080fd5b5061012e610c04565b3480156102c657600080fd5b5061019d610da9565b3480156102db57600080fd5b506102e4610db8565b60405161015f91906114de565b3480156102fd57600080fd5b5061019d610f19565b6000546001600160a01b031633146103395760405162461bcd60e51b8152600401610330906113b4565b60405180910390fd5b81156103d4576001600160a01b0383161515806103535750805b61036f5760405162461bcd60e51b8152600401610330906112d6565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b0319918216179091556001805490911690556103f0565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60056020526000908152604090208054600182015460029092015490919083565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461045e5760405162461bcd60e51b815260040161033090611455565b6002805414156104805760405162461bcd60e51b8152600401610330906114a7565b6002805561048c610db8565b506104956110f3565b5060408051808201825260035481526004546020808301919091526001600160a01b0385166000908152600590915291822080549192909115610785576105178260020154610511846001015464e8d4a5100061050388600001518860000154610f4390919063ffffffff16565b8161050a57fe5b0490610f86565b90610fae565b90507f00000000000000000000000000000000000000000000000000000000000000001561065d5747808211156105d2576000866001600160a01b03168260405161056190610a5c565b60006040518083038185875af1925050503d806000811461059e576040519150601f19603f3d011682016040523d82523d6000602084013e6105a3565b606091505b50509050806105c45760405162461bcd60e51b815260040161033090611276565b508082036002840155610657565b6000866001600160a01b0316836040516105eb90610a5c565b60006040518083038185875af1925050503d8060008114610628576040519150601f19603f3d011682016040523d82523d6000602084013e61062d565b606091505b505090508061064e5760405162461bcd60e51b815260040161033090611276565b50600060028401555b50610785565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906106ac90309060040161123e565b60206040518083038186803b1580156106c457600080fd5b505afa1580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fc91906111ed565b9050808211156107475761073a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610fd3565b8082036002840155610783565b61077b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168784610fd3565b600060028401555b505b838255825164e8d4a510009061079c908690610f43565b816107a357fe5b04600183015560028201546040516001600160a01b038716917fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b4916107ea918503906114f5565b60405180910390a250506001600255505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633811461084d5760405162461bcd60e51b8152600401610330906113e9565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b60065481565b60035460045482565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b6000546001600160a01b0316331461093f5760405162461bcd60e51b8152600401610330906113b4565b610947610db8565b5060068054908290556040517fc390a98ace15a7bb6bab611eedfdbb2685043b241a869420043cdfb23ccfee509061098290839085906114fe565b60405180910390a15050565b60007f0000000000000000000000000000000000000000000000000000000000000000156109bd575047610a5c565b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610a0990309060040161123e565b60206040518083038186803b158015610a2157600080fd5b505afa158015610a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5991906111ed565b90505b90565b6000610a696110f3565b506040805180820182526003548152600480546020808401919091526001600160a01b0380871660009081526005909252848220845195516370a0823160e01b81529495909490937f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191610b08917f0000000000000000000000000000000000000000000000000000000000000000910161123e565b60206040518083038186803b158015610b2057600080fd5b505afa158015610b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5891906111ed565b9050836020015142118015610b6c57508015155b15610bcd576000610b8a856020015142610f8690919063ffffffff16565b90506000610ba360065483610f4390919063ffffffff16565b9050610bc8610bc184610bbb8464e8d4a51000610f43565b906110c1565b8590610fae565b935050505b610bfa8360020154610511856001015464e8d4a51000610503878960000154610f4390919063ffffffff16565b9695505050505050565b6000546001600160a01b03163314610c2e5760405162461bcd60e51b8152600401610330906113b4565b7f000000000000000000000000000000000000000000000000000000000000000015610cd6576000336001600160a01b031647604051610c6d90610a5c565b60006040518083038185875af1925050503d8060008114610caa576040519150601f19603f3d011682016040523d82523d6000602084013e610caf565b606091505b5050905080610cd05760405162461bcd60e51b815260040161033090611276565b50610da7565b610da7337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610d26919061123e565b60206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7691906111ed565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190610fd3565b565b6001546001600160a01b031681565b610dc06110f3565b5060408051808201909152600354815260045460208201819052421115610a5c576040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610e50907f00000000000000000000000000000000000000000000000000000000000000009060040161123e565b60206040518083038186803b158015610e6857600080fd5b505afa158015610e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea091906111ed565b90508015610f05576000610ec1836020015142610f8690919063ffffffff16565b90506000610eda60065483610f4390919063ffffffff16565b9050610f0083610eef8364e8d4a51000610f43565b81610ef657fe5b8651919004610fae565b845250505b504260208201819052815160035560045590565b7f000000000000000000000000000000000000000000000000000000000000000081565b3b151590565b600082610f5257506000610f80565b82820282848281610f5f57fe5b0414610f7d5760405162461bcd60e51b815260040161033090611373565b90505b92915050565b600082821115610fa85760405162461bcd60e51b815260040161033090611305565b50900390565b600082820183811015610f7d5760405162461bcd60e51b81526004016103309061129f565b60006060846001600160a01b031663a9059cbb8585604051602401610ff9929190611252565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516110329190611205565b6000604051808303816000865af19150503d806000811461106f576040519150601f19603f3d011682016040523d82523d6000602084013e611074565b606091505b509150915081801561109e57508051158061109e57508080602001905181019061109e91906111b9565b6110ba5760405162461bcd60e51b81526004016103309061141e565b5050505050565b60008082116110e25760405162461bcd60e51b81526004016103309061133c565b8183816110eb57fe5b049392505050565b604051806040016040528060008152602001600081525090565b80356001600160a01b0381168114610f8057600080fd5b600060208284031215611135578081fd5b61113f838361110d565b9392505050565b60008060006060848603121561115a578182fd5b611164858561110d565b9250602084013561117481611522565b9150604084013561118481611522565b809150509250925092565b600080604083850312156111a1578182fd5b6111ab848461110d565b946020939093013593505050565b6000602082840312156111ca578081fd5b8151610f7d81611522565b6000602082840312156111e6578081fd5b5035919050565b6000602082840312156111fe578081fd5b5051919050565b60008251815b81811015611225576020818601810151858301520161120b565b818111156112335782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601a908201527f5361666545524332303a205472616e73666572206661696c6564000000000000604082015260600190565b60208082526032908201527f6f6e6c794d434a3a206f6e6c79204d6173746572436865664a6f652063616e2060408201527131b0b636103a3434b990333ab731ba34b7b760711b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b815181526020918201519181019190915260400190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b801515811461153057600080fd5b5056fea26469706673582212204e43430a5e614eacf62e479da8d22e21b4a738b78ee0cefb156dc5fcd4e5e60f64736f6c634300060c0033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "onJoeReward(address,uint256)": {
        "params": {
          "_lpAmount": "Number of LP tokens the user has",
          "_user": "Address of user"
        }
      },
      "pendingTokens(address)": {
        "params": {
          "_user": "Address of user."
        },
        "returns": {
          "pending": "reward for a given user."
        }
      },
      "setRewardRate(uint256)": {
        "params": {
          "_tokenPerSec": "The number of tokens to distribute per second"
        }
      },
      "transferOwnership(address,bool,bool)": {
        "params": {
          "direct": "True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.",
          "newOwner": "Address of the new owner.",
          "renounce": "Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise."
        }
      },
      "updatePool()": {
        "returns": {
          "pool": "Returns the pool that was updated."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "balance()": {
        "notice": "View function to see balance of reward token."
      },
      "claimOwnership()": {
        "notice": "Needs to be called by `pendingOwner` to claim ownership."
      },
      "emergencyWithdraw()": {
        "notice": "In case rewarder is stopped before emissions finished, this function allows withdrawal of remaining tokens."
      },
      "onJoeReward(address,uint256)": {
        "notice": "Function called by MasterChefJoe whenever staker claims JOE harvest. Allows staker to also receive a 2nd reward token."
      },
      "pendingTokens(address)": {
        "notice": "View function to see pending tokens"
      },
      "poolInfo()": {
        "notice": "Info of the poolInfo."
      },
      "setRewardRate(uint256)": {
        "notice": "Sets the distribution reward rate. This will also update the poolInfo."
      },
      "transferOwnership(address,bool,bool)": {
        "notice": "Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner. Can only be invoked by the current `owner`."
      },
      "updatePool()": {
        "notice": "Update reward variables of the given poolInfo."
      },
      "userInfo(address)": {
        "notice": "Info of each user that stakes LP tokens."
      }
    },
    "notice": "This is a sample contract to be used in the MasterChefJoe contract for partners to reward stakers with their native token alongside JOE. It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior. E.g. say you've allocated 100,000 XYZ to the JOE-XYZ farm over 30 days. Then you would need to transfer 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 14234,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "owner",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 14236,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "pendingOwner",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 2458,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "_status",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 17321,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "poolInfo",
        "offset": 0,
        "slot": "3",
        "type": "t_struct(PoolInfo)17318_storage"
      },
      {
        "astId": 17326,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "userInfo",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_struct(UserInfo)17313_storage)"
      },
      {
        "astId": 17328,
        "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
        "label": "tokenPerSec",
        "offset": 0,
        "slot": "6",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_mapping(t_address,t_struct(UserInfo)17313_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct SimpleRewarderPerSec.UserInfo)",
        "numberOfBytes": "32",
        "value": "t_struct(UserInfo)17313_storage"
      },
      "t_struct(PoolInfo)17318_storage": {
        "encoding": "inplace",
        "label": "struct SimpleRewarderPerSec.PoolInfo",
        "members": [
          {
            "astId": 17315,
            "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
            "label": "accTokenPerShare",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 17317,
            "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
            "label": "lastRewardTimestamp",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(UserInfo)17313_storage": {
        "encoding": "inplace",
        "label": "struct SimpleRewarderPerSec.UserInfo",
        "members": [
          {
            "astId": 17308,
            "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
            "label": "amount",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 17310,
            "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
            "label": "rewardDebt",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 17312,
            "contract": "contracts/rewarders/SimpleRewarderPerSec.sol:SimpleRewarderPerSec",
            "label": "unpaidRewards",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}