{
  "id": "6b7d8c83d5bb271db3ac5e2fd5434f7d",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.12",
  "solcLongVersion": "0.6.12+commit.27d51765",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/ConvexRewarder.sol": {
        "content": "// SPDX-License-Identifier: MIT\r\npragma solidity 0.6.12;\r\n\r\n\r\n/**\r\n * @dev Standard math utilities missing in the Solidity language.\r\n */\r\nlibrary MathUtil {\r\n    /**\r\n     * @dev Returns the smallest of two numbers.\r\n     */\r\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        return a < b ? a : b;\r\n    }\r\n}\r\n\r\ncontract ReentrancyGuard {\r\n    uint256 private _guardCounter;\r\n\r\n    constructor () internal {\r\n        _guardCounter = 1;\r\n    }\r\n\r\n    modifier nonReentrant() {\r\n        _guardCounter += 1;\r\n        uint256 localCounter = _guardCounter;\r\n        _;\r\n        require(localCounter == _guardCounter, \"ReentrancyGuard: reentrant call\");\r\n    }\r\n}\r\n\r\ninterface ICurveGauge {\r\n    function deposit(uint256) external;\r\n    function balanceOf(address) external view returns (uint256);\r\n    function withdraw(uint256) external;\r\n    function claim_rewards() external;\r\n    function reward_tokens(uint256) external view returns(address);//v2\r\n    function rewarded_token() external view returns(address);//v1\r\n}\r\n\r\ninterface ICurveVoteEscrow {\r\n    function create_lock(uint256, uint256) external;\r\n    function increase_amount(uint256) external;\r\n    function increase_unlock_time(uint256) external;\r\n    function withdraw() external;\r\n    function smart_wallet_checker() external view returns (address);\r\n}\r\n\r\ninterface IWalletChecker {\r\n    function check(address) external view returns (bool);\r\n}\r\n\r\ninterface IVoting{\r\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\r\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\r\n    function vote_for_gauge_weights(address,uint256) external;\r\n}\r\n\r\ninterface IMinter{\r\n    function mint(address) external;\r\n}\r\n\r\ninterface IRegistry{\r\n    function get_registry() external view returns(address);\r\n    function get_address(uint256 _id) external view returns(address);\r\n    function gauge_controller() external view returns(address);\r\n    function get_lp_token(address) external view returns(address);\r\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\r\n}\r\n\r\ninterface IStaker{\r\n    function deposit(address, address) external;\r\n    function withdraw(address) external;\r\n    function withdraw(address, address, uint256) external;\r\n    function withdrawAll(address, address) external;\r\n    function createLock(uint256, uint256) external;\r\n    function increaseAmount(uint256) external;\r\n    function increaseTime(uint256) external;\r\n    function release() external;\r\n    function claimCrv(address) external returns (uint256);\r\n    function claimRewards(address) external;\r\n    function claimFees(address,address) external;\r\n    function setStashAccess(address, bool) external;\r\n    function vote(uint256,address,bool) external;\r\n    function voteGaugeWeight(address,uint256) external;\r\n    function balanceOfPool(address) external view returns (uint256);\r\n    function operator() external view returns (address);\r\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\r\n}\r\n\r\ninterface IRewards{\r\n    function stake(address, uint256) external;\r\n    function stakeFor(address, uint256) external;\r\n    function withdraw(address, uint256) external;\r\n    function exit(address) external;\r\n    function getReward(address) external;\r\n    function queueNewRewards(uint256) external;\r\n    function notifyRewardAmount(uint256) external;\r\n    function addExtraReward(address) external;\r\n    function stakingToken() external view returns (address);\r\n    function rewardToken() external view returns(address);\r\n    function earned(address account) external view returns (uint256);\r\n}\r\n\r\ninterface IStash{\r\n    function stashRewards() external returns (bool);\r\n    function processStash() external returns (bool);\r\n    function claimRewards() external returns (bool);\r\n}\r\n\r\ninterface IFeeDistro{\r\n    function claim() external;\r\n    function token() external view returns(address);\r\n}\r\n\r\ninterface ITokenMinter{\r\n    function mint(address,uint256) external;\r\n    function burn(address,uint256) external;\r\n}\r\n\r\ninterface IDeposit{\r\n    function isShutdown() external view returns(bool);\r\n    function balanceOf(address _account) external view returns(uint256);\r\n    function totalSupply() external view returns(uint256);\r\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\r\n    function rewardClaimed(uint256,address,uint256) external;\r\n    function withdrawTo(uint256,uint256,address) external;\r\n    function claimRewards(uint256,address) external returns(bool);\r\n    function rewardArbitrator() external returns(address);\r\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\r\n}\r\n\r\ninterface ICrvDeposit{\r\n    function deposit(uint256, bool) external;\r\n    function lockIncentive() external view returns(uint256);\r\n}\r\n\r\ninterface IRewardFactory{\r\n    function setAccess(address,bool) external;\r\n    function CreateCrvRewards(uint256,address) external returns(address);\r\n    function CreateTokenRewards(address,address,address) external returns(address);\r\n    function activeRewardCount(address) external view returns(uint256);\r\n    function addActiveReward(address,uint256) external returns(bool);\r\n    function removeActiveReward(address,uint256) external returns(bool);\r\n}\r\n\r\ninterface IStashFactory{\r\n    function CreateStash(uint256,address,address,uint256) external returns(address);\r\n}\r\n\r\ninterface ITokenFactory{\r\n    function CreateDepositToken(address) external returns(address);\r\n}\r\n\r\ninterface IPools{\r\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\r\n    function shutdownPool(uint256 _pid) external returns(bool);\r\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\r\n    function poolLength() external view returns (uint256);\r\n    function gaugeMap(address) external view returns(bool);\r\n    function setPoolManager(address _poolM) external;\r\n}\r\n\r\ninterface IVestedEscrow{\r\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\r\n}\r\n\r\n// File: @openzeppelin\\contracts\\token\\ERC20\\IERC20.sol\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/**\r\n * @dev Interface of the ERC20 standard as defined in the EIP.\r\n */\r\ninterface IERC20 {\r\n    /**\r\n     * @dev Returns the amount of tokens in existence.\r\n     */\r\n    function totalSupply() external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Returns the amount of tokens owned by `account`.\r\n     */\r\n    function balanceOf(address account) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * Emits a {Transfer} event.\r\n     */\r\n    function transfer(address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Returns the remaining number of tokens that `spender` will be\r\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\r\n     * zero by default.\r\n     *\r\n     * This value changes when {approve} or {transferFrom} are called.\r\n     */\r\n    function allowance(address owner, address spender) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\r\n     * that someone may use both the old and the new allowance by unfortunate\r\n     * transaction ordering. One possible solution to mitigate this race\r\n     * condition is to first reduce the spender's allowance to 0 and set the\r\n     * desired value afterwards:\r\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n     *\r\n     * Emits an {Approval} event.\r\n     */\r\n    function approve(address spender, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\r\n     * allowance mechanism. `amount` is then deducted from the caller's\r\n     * allowance.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * Emits a {Transfer} event.\r\n     */\r\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\r\n     * another (`to`).\r\n     *\r\n     * Note that `value` may be zero.\r\n     */\r\n    event Transfer(address indexed from, address indexed to, uint256 value);\r\n\r\n    /**\r\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\r\n     * a call to {approve}. `value` is the new allowance.\r\n     */\r\n    event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\n// File: node_modules\\@openzeppelin\\contracts\\math\\SafeMath.sol\r\n\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n/**\r\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\r\n * checks.\r\n *\r\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\r\n * in bugs, because programmers usually assume that an overflow raises an\r\n * error, which is the standard behavior in high level programming languages.\r\n * `SafeMath` restores this intuition by reverting the transaction when an\r\n * operation overflows.\r\n *\r\n * Using this library instead of the unchecked operations eliminates an entire\r\n * class of bugs, so it's recommended to use it always.\r\n */\r\nlibrary SafeMath {\r\n    /**\r\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\r\n        uint256 c = a + b;\r\n        if (c < a) return (false, 0);\r\n        return (true, c);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\r\n        if (b > a) return (false, 0);\r\n        return (true, a - b);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\r\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\r\n        // benefit is lost if 'b' is also tested.\r\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\r\n        if (a == 0) return (true, 0);\r\n        uint256 c = a * b;\r\n        if (c / a != b) return (false, 0);\r\n        return (true, c);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\r\n        if (b == 0) return (false, 0);\r\n        return (true, a / b);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\r\n        if (b == 0) return (false, 0);\r\n        return (true, a % b);\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the addition of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `+` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Addition cannot overflow.\r\n     */\r\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        uint256 c = a + b;\r\n        require(c >= a, \"SafeMath: addition overflow\");\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        require(b <= a, \"SafeMath: subtraction overflow\");\r\n        return a - b;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the multiplication of two unsigned integers, reverting on\r\n     * overflow.\r\n     *\r\n     * Counterpart to Solidity's `*` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Multiplication cannot overflow.\r\n     */\r\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        if (a == 0) return 0;\r\n        uint256 c = a * b;\r\n        require(c / a == b, \"SafeMath: multiplication overflow\");\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers, reverting on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        require(b > 0, \"SafeMath: division by zero\");\r\n        return a / b;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * reverting when dividing by zero.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\r\n        require(b > 0, \"SafeMath: modulo by zero\");\r\n        return a % b;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\r\n     * overflow (when the result is negative).\r\n     *\r\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\r\n     * message unnecessarily. For custom revert reasons use {trySub}.\r\n     *\r\n     * Counterpart to Solidity's `-` operator.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - Subtraction cannot overflow.\r\n     */\r\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b <= a, errorMessage);\r\n        return a - b;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\r\n     * division by zero. The result is rounded towards zero.\r\n     *\r\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\r\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\r\n     *\r\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\r\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\r\n     * uses an invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b > 0, errorMessage);\r\n        return a / b;\r\n    }\r\n\r\n    /**\r\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\r\n     * reverting with custom message when dividing by zero.\r\n     *\r\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\r\n     * message unnecessarily. For custom revert reasons use {tryMod}.\r\n     *\r\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\r\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\r\n     * invalid opcode to revert (consuming all remaining gas).\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - The divisor cannot be zero.\r\n     */\r\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\r\n        require(b > 0, errorMessage);\r\n        return a % b;\r\n    }\r\n}\r\n\r\n// File: node_modules\\@openzeppelin\\contracts\\utils\\Address.sol\r\n\r\npragma solidity >=0.6.2 <0.8.0;\r\n\r\n/**\r\n * @dev Collection of functions related to the address type\r\n */\r\nlibrary Address {\r\n    /**\r\n     * @dev Returns true if `account` is a contract.\r\n     *\r\n     * [IMPORTANT]\r\n     * ====\r\n     * It is unsafe to assume that an address for which this function returns\r\n     * false is an externally-owned account (EOA) and not a contract.\r\n     *\r\n     * Among others, `isContract` will return false for the following\r\n     * types of addresses:\r\n     *\r\n     *  - an externally-owned account\r\n     *  - a contract in construction\r\n     *  - an address where a contract will be created\r\n     *  - an address where a contract lived, but was destroyed\r\n     * ====\r\n     */\r\n    function isContract(address account) internal view returns (bool) {\r\n        // This method relies on extcodesize, which returns 0 for contracts in\r\n        // construction, since the code is only stored at the end of the\r\n        // constructor execution.\r\n\r\n        uint256 size;\r\n        // solhint-disable-next-line no-inline-assembly\r\n        assembly { size := extcodesize(account) }\r\n        return size > 0;\r\n    }\r\n\r\n    /**\r\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\r\n     * `recipient`, forwarding all available gas and reverting on errors.\r\n     *\r\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\r\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\r\n     * imposed by `transfer`, making them unable to receive funds via\r\n     * `transfer`. {sendValue} removes this limitation.\r\n     *\r\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\r\n     *\r\n     * IMPORTANT: because control is transferred to `recipient`, care must be\r\n     * taken to not create reentrancy vulnerabilities. Consider using\r\n     * {ReentrancyGuard} or the\r\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\r\n     */\r\n    function sendValue(address payable recipient, uint256 amount) internal {\r\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\r\n        (bool success, ) = recipient.call{ value: amount }(\"\");\r\n        require(success, \"Address: unable to send value, recipient may have reverted\");\r\n    }\r\n\r\n    /**\r\n     * @dev Performs a Solidity function call using a low level `call`. A\r\n     * plain`call` is an unsafe replacement for a function call: use this\r\n     * function instead.\r\n     *\r\n     * If `target` reverts with a revert reason, it is bubbled up by this\r\n     * function (like regular Solidity function calls).\r\n     *\r\n     * Returns the raw returned data. To convert to the expected return value,\r\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - `target` must be a contract.\r\n     * - calling `target` with `data` must not revert.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\r\n        return functionCall(target, data, \"Address: low-level call failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\r\n     * `errorMessage` as a fallback revert reason when `target` reverts.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\r\n        return functionCallWithValue(target, data, 0, errorMessage);\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\r\n     * but also transferring `value` wei to `target`.\r\n     *\r\n     * Requirements:\r\n     *\r\n     * - the calling contract must have an ETH balance of at least `value`.\r\n     * - the called Solidity function must be `payable`.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\r\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\r\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\r\n     *\r\n     * _Available since v3.1._\r\n     */\r\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\r\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\r\n        require(isContract(target), \"Address: call to non-contract\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls\r\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\r\n        return _verifyCallResult(success, returndata, errorMessage);\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\r\n     * but performing a static call.\r\n     *\r\n     * _Available since v3.3._\r\n     */\r\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\r\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\r\n     * but performing a static call.\r\n     *\r\n     * _Available since v3.3._\r\n     */\r\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\r\n        require(isContract(target), \"Address: static call to non-contract\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls\r\n        (bool success, bytes memory returndata) = target.staticcall(data);\r\n        return _verifyCallResult(success, returndata, errorMessage);\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\r\n     * but performing a delegate call.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\r\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\r\n    }\r\n\r\n    /**\r\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\r\n     * but performing a delegate call.\r\n     *\r\n     * _Available since v3.4._\r\n     */\r\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\r\n        require(isContract(target), \"Address: delegate call to non-contract\");\r\n\r\n        // solhint-disable-next-line avoid-low-level-calls\r\n        (bool success, bytes memory returndata) = target.delegatecall(data);\r\n        return _verifyCallResult(success, returndata, errorMessage);\r\n    }\r\n\r\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\r\n        if (success) {\r\n            return returndata;\r\n        } else {\r\n            // Look for revert reason and bubble it up if present\r\n            if (returndata.length > 0) {\r\n                // The easiest way to bubble the revert reason is using memory via assembly\r\n\r\n                // solhint-disable-next-line no-inline-assembly\r\n                assembly {\r\n                    let returndata_size := mload(returndata)\r\n                    revert(add(32, returndata), returndata_size)\r\n                }\r\n            } else {\r\n                revert(errorMessage);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// File: @openzeppelin\\contracts\\token\\ERC20\\SafeERC20.sol\r\npragma solidity >=0.6.0 <0.8.0;\r\n\r\n\r\n/**\r\n * @title SafeERC20\r\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\r\n * contract returns false). Tokens that return no value (and instead revert or\r\n * throw on failure) are also supported, non-reverting calls are assumed to be\r\n * successful.\r\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\r\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\r\n */\r\nlibrary SafeERC20 {\r\n    using SafeMath for uint256;\r\n    using Address for address;\r\n\r\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\r\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\r\n    }\r\n\r\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\r\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\r\n    }\r\n\r\n    /**\r\n     * @dev Deprecated. This function has issues similar to the ones found in\r\n     * {IERC20-approve}, and its usage is discouraged.\r\n     *\r\n     * Whenever possible, use {safeIncreaseAllowance} and\r\n     * {safeDecreaseAllowance} instead.\r\n     */\r\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\r\n        // safeApprove should only be called when setting an initial allowance,\r\n        // or when resetting it to zero. To increase and decrease it, use\r\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\r\n        // solhint-disable-next-line max-line-length\r\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\r\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\r\n        );\r\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\r\n    }\r\n\r\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\r\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\r\n    }\r\n\r\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\r\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\r\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\r\n    }\r\n\r\n    /**\r\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\r\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\r\n     * @param token The token targeted by the call.\r\n     * @param data The call data (encoded using abi.encode or one of its variants).\r\n     */\r\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\r\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\r\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\r\n        // the target address contains contract code and also asserts for success in the low-level call.\r\n\r\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\r\n        if (returndata.length > 0) { // Return data is optional\r\n            // solhint-disable-next-line max-line-length\r\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\r\n        }\r\n    }\r\n}\r\n\r\n// File: contracts\\interfaces\\ITattooRewarder.sol\r\n\r\npragma solidity 0.6.12;\r\n\r\ninterface ITattooRewarder {\r\n    using SafeERC20 for IERC20;\r\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\r\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\r\n}\r\n\r\n\r\n// File: contracts\\ConvexRewarder.sol\r\n\r\npragma solidity 0.6.12;\r\n/**\r\n *Submitted for verification at Etherscan.io on 2020-07-17\r\n */\r\n\r\n/*\r\n   ____            __   __        __   _\r\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\r\n _\\ \\ / // // _ \\/ __// _ \\/ -_)/ __// / \\ \\ /\r\n/___/ \\_, //_//_/\\__//_//_/\\__/ \\__//_/ /_\\_\\\r\n     /___/\r\n\r\n* Docs: https://docs.synthetix.io/\r\n*\r\n*\r\n* MIT License\r\n* ===========\r\n*\r\n* Copyright (c) 2020 Synthetix\r\n*\r\n* Permission is hereby granted, free of charge, to any person obtaining a copy\r\n* of this software and associated documentation files (the \"Software\"), to deal\r\n* in the Software without restriction, including without limitation the rights\r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n* copies of the Software, and to permit persons to whom the Software is\r\n* furnished to do so, subject to the following conditions:\r\n*\r\n* The above copyright notice and this permission notice shall be included in all\r\n* copies or substantial portions of the Software.\r\n*\r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n*/\r\n\r\n\r\n\r\ninterface IMasterChefV2 {\r\n    function lpToken(uint i) external view returns (IERC20);\r\n}\r\n\r\ninterface IConvexChef{\r\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\r\n    function claim(uint256 _pid, address _account) external;\r\n    function deposit(uint256 _pid, uint256 _amount) external;\r\n}\r\n\r\n\r\ncontract ConvexRewarder is ITattooRewarder{\r\n    using SafeERC20 for IERC20;\r\n    using SafeMath for uint256;\r\n\r\n    IERC20 public immutable rewardToken;\r\n    IERC20 public immutable stakingToken;\r\n    uint256 public constant duration = 5 days;\r\n\r\n    address public immutable rewardManager;\r\n    address public immutable tattooMasterChef;\r\n    address public immutable convexMasterChef;\r\n    uint256 public immutable chefPid;\r\n\r\n    uint256 public periodFinish = 0;\r\n    uint256 public rewardRate = 0;\r\n    uint256 public lastUpdateTime;\r\n    uint256 public rewardPerTokenStored;\r\n    uint256 public currentRewards = 0;\r\n    uint256 private _totalSupply;\r\n    uint256 public tattooPid;\r\n    uint256 public previousRewardDebt = 0;\r\n    bool public isInit = false;\r\n\r\n    mapping(address => uint256) private _balances;\r\n    mapping(address => uint256) private _tattooBalances;\r\n    mapping(address => uint256) public userRewardPerTokenPaid;\r\n    mapping(address => uint256) public rewards;\r\n\r\n    address[] public extraRewards;\r\n\r\n    event RewardAdded(uint256 reward);\r\n    event Staked(address indexed user, uint256 amount);\r\n    event Withdrawn(address indexed user, uint256 amount);\r\n    event RewardPaid(address indexed user, uint256 reward);\r\n\r\n    constructor(\r\n        address stakingToken_,\r\n        address rewardToken_,\r\n        address rewardManager_,\r\n        address tattooMasterChef_,\r\n        address convexMasterChef_,\r\n        uint256 chefPid_\r\n    ) public {\r\n        stakingToken = IERC20(stakingToken_);\r\n        rewardToken = IERC20(rewardToken_);\r\n        rewardManager = rewardManager_;\r\n        tattooMasterChef = tattooMasterChef_;\r\n        convexMasterChef = convexMasterChef_;\r\n        chefPid = chefPid_;\r\n    }\r\n\r\n    //stake a dummy token into convex chef to start earning rewards\r\n    //initiate a week's worth of awards\r\n    function init(IERC20 dummyToken) external {\r\n        require(!isInit,\"already init\");\r\n        isInit = true;\r\n        uint256 balance = dummyToken.balanceOf(msg.sender);\r\n        require(balance != 0, \"Balance must exceed 0\");\r\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\r\n        dummyToken.approve(convexMasterChef, balance);\r\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\r\n        initRewards();\r\n    }\r\n\r\n    //claim from convex master chef and add to rewards\r\n    function harvestFromMasterChef() public {\r\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\r\n        notifyRewardAmount();\r\n    }\r\n\r\n    function totalSupply() public view returns (uint256) {\r\n        return _totalSupply;\r\n    }\r\n\r\n    function balanceOf(address account) public view returns (uint256) {\r\n        return _balances[account].add(_tattooBalances[account]);\r\n    }\r\n\r\n    function localBalanceOf(address account) public view returns (uint256) {\r\n        return _balances[account];\r\n    }\r\n\r\n    function tattooBalanceOf(address account) public view returns (uint256) {\r\n        return _tattooBalances[account];\r\n    }\r\n\r\n    function extraRewardsLength() external view returns (uint256) {\r\n        return extraRewards.length;\r\n    }\r\n\r\n    function addExtraReward(address _reward) external {\r\n        require(msg.sender == rewardManager, \"!authorized\");\r\n        require(_reward != address(0),\"!reward setting\");\r\n\r\n        extraRewards.push(_reward);\r\n    }\r\n    function clearExtraRewards() external{\r\n        require(msg.sender == rewardManager, \"!authorized\");\r\n        delete extraRewards;\r\n    }\r\n\r\n    modifier updateReward(address account) {\r\n        rewardPerTokenStored = rewardPerToken();\r\n        lastUpdateTime = lastTimeRewardApplicable();\r\n        if (account != address(0)) {\r\n            rewards[account] = earned(account);\r\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\r\n        }\r\n        _;\r\n    }\r\n\r\n    function lastTimeRewardApplicable() public view returns (uint256) {\r\n        return MathUtil.min(block.timestamp, periodFinish);\r\n    }\r\n\r\n    function rewardPerToken() public view returns (uint256) {\r\n        uint256 supply = totalSupply();\r\n        if (supply == 0) {\r\n            return rewardPerTokenStored;\r\n        }\r\n        return\r\n        rewardPerTokenStored.add(\r\n            lastTimeRewardApplicable()\r\n            .sub(lastUpdateTime)\r\n            .mul(rewardRate)\r\n            .mul(1e18)\r\n            .div(supply)\r\n        );\r\n    }\r\n\r\n    function earned(address account) public view returns (uint256) {\r\n        return\r\n        _balances[account].add(_tattooBalances[account])\r\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\r\n        .div(1e18)\r\n        .add(rewards[account]);\r\n    }\r\n\r\n    function stake(uint256 _amount)\r\n    public\r\n    updateReward(msg.sender)\r\n    {\r\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\r\n\r\n        //check if new rewards should be pulled from convex chef\r\n        checkHarvest();\r\n\r\n        //also stake to linked rewards\r\n        uint256 length = extraRewards.length;\r\n        for(uint i=0; i < length; i++){\r\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\r\n        }\r\n\r\n        //add supply\r\n        _totalSupply = _totalSupply.add(_amount);\r\n        //add to sender balance sheet\r\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\r\n        //take tokens from sender\r\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\r\n\r\n        emit Staked(msg.sender, _amount);\r\n    }\r\n\r\n    function stakeAll() external{\r\n        uint256 balance = stakingToken.balanceOf(msg.sender);\r\n        stake(balance);\r\n    }\r\n\r\n    function stakeFor(address _for, uint256 _amount)\r\n    public\r\n    updateReward(_for)\r\n    {\r\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\r\n\r\n        //check if new rewards should be pulled from convex chef\r\n        checkHarvest();\r\n\r\n        //also stake to linked rewards\r\n        uint256 length = extraRewards.length;\r\n        for(uint i=0; i < length; i++){\r\n            IRewards(extraRewards[i]).stake(_for, _amount);\r\n        }\r\n\r\n        //add supply\r\n        _totalSupply = _totalSupply.add(_amount);\r\n        //add to _for's balance sheet\r\n        _balances[_for] = _balances[_for].add(_amount);\r\n        //take tokens from sender\r\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\r\n\r\n        emit Staked(msg.sender, _amount);\r\n    }\r\n\r\n    function withdraw(uint256 _amount, bool claim)\r\n    public\r\n    updateReward(msg.sender)\r\n    {\r\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\r\n\r\n        //also withdraw from linked rewards\r\n        uint256 length = extraRewards.length;\r\n        for(uint i=0; i < length; i++){\r\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\r\n        }\r\n\r\n        _totalSupply = _totalSupply.sub(_amount);\r\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\r\n        stakingToken.safeTransfer(msg.sender, _amount);\r\n        emit Withdrawn(msg.sender, _amount);\r\n\r\n        if(claim){\r\n            getReward(msg.sender,true);\r\n        }\r\n    }\r\n\r\n    function withdrawAll(bool claim) external{\r\n        withdraw(_balances[msg.sender],claim);\r\n    }\r\n\r\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\r\n\r\n        uint256 reward = earned(_account);\r\n        if (reward > 0) {\r\n            rewards[_account] = 0;\r\n            rewardToken.safeTransfer(_account, reward);\r\n            emit RewardPaid(_account, reward);\r\n        }\r\n\r\n        //also get rewards from linked rewards\r\n        if(_claimExtras){\r\n            uint256 length = extraRewards.length;\r\n            for(uint i=0; i < length; i++){\r\n                IRewards(extraRewards[i]).getReward(_account);\r\n            }\r\n        }\r\n\r\n        //check if new rewards should be pulled from convex chef\r\n        checkHarvest();\r\n    }\r\n\r\n    function getReward() external{\r\n        getReward(msg.sender,true);\r\n    }\r\n\r\n    function checkHarvest() internal{\r\n        //if getting close to the end of the period\r\n        //claim and extend\r\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\r\n            harvestFromMasterChef();\r\n        }\r\n    }\r\n\r\n    //initialize the period of rewards\r\n    //since the reward rate should be same as speed as rewards coming in from the chef\r\n    // it will never catch up unless there is a seed\r\n    // (or if it mines for a week with 0 distribution)\r\n    function initRewards() internal updateReward(address(0)){\r\n        uint256 reward = rewardToken.balanceOf(address(this));\r\n\r\n        if (block.timestamp >= periodFinish) {\r\n            rewardRate = reward.div(duration);\r\n        } else {\r\n            uint256 remaining = periodFinish.sub(block.timestamp);\r\n            uint256 leftover = remaining.mul(rewardRate);\r\n            reward = reward.add(leftover);\r\n            rewardRate = reward.div(duration);\r\n        }\r\n        currentRewards = reward;\r\n        lastUpdateTime = block.timestamp;\r\n        periodFinish = block.timestamp.add(duration);\r\n        emit RewardAdded(reward);\r\n    }\r\n\r\n    function notifyRewardAmount()\r\n    internal\r\n    updateReward(address(0))\r\n    {\r\n        if(!isInit){\r\n            //return smoothly if not init yet.\r\n            //allow stakers to join but dont start distribution\r\n            return;\r\n        }\r\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\r\n        //so that we know how much we have claimed since previous notifyRewardAmount()\r\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\r\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\r\n        previousRewardDebt = rewardDebt;\r\n        if(reward == 0) return;\r\n\r\n        if (block.timestamp >= periodFinish) {\r\n            rewardRate = reward.div(duration);\r\n        } else {\r\n            uint256 remaining = periodFinish.sub(block.timestamp);\r\n            uint256 leftover = remaining.mul(rewardRate);\r\n            reward = reward.add(leftover);\r\n            rewardRate = reward.div(duration);\r\n        }\r\n        currentRewards = reward;\r\n        lastUpdateTime = block.timestamp;\r\n        periodFinish = block.timestamp.add(duration);\r\n        emit RewardAdded(reward);\r\n    }\r\n\r\n    function onTattooReward(\r\n        uint256 pid,\r\n        address user,\r\n        address recipient,\r\n        uint256 tattooAmount,\r\n        uint256 newLpAmount\r\n    )\r\n    override\r\n    external\r\n    updateReward(user)\r\n    {\r\n        require(msg.sender == tattooMasterChef);\r\n\r\n        // On the first call, validate that the pid correctly maps to our stakingToken\r\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\r\n        // this to be safe in the future. If we did not validate the pid going forward, there\r\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\r\n        uint256 _tattooPid = tattooPid;\r\n        if (_tattooPid == 0) {\r\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\r\n            tattooPid = pid;\r\n        } else {\r\n            require(pid == _tattooPid);\r\n        }\r\n\r\n        if (tattooAmount > 0) {\r\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\r\n\r\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\r\n            //just claim to original account\r\n            getReward(user,true);\r\n        }\r\n\r\n        uint256 userBalance = _tattooBalances[user];\r\n        if (newLpAmount > userBalance) {\r\n            // reported balance in tattoo > internal accounting, user has deposited\r\n            uint256 amount = newLpAmount.sub(userBalance);\r\n            uint256 length = extraRewards.length;\r\n            for(uint i=0; i < length; i++){\r\n                IRewards(extraRewards[i]).stake(user, amount);\r\n            }\r\n            _totalSupply = _totalSupply.add(amount);\r\n            _tattooBalances[user] = newLpAmount;\r\n\r\n        } else if (newLpAmount < userBalance) {\r\n            // reported balance in tattoo < internal accounting, user has withdrawn\r\n            uint256 amount = userBalance.sub(newLpAmount);\r\n            uint256 length = extraRewards.length;\r\n            for(uint i=0; i < length; i++){\r\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\r\n            }\r\n            _totalSupply = _totalSupply.sub(amount);\r\n            _tattooBalances[user] = newLpAmount;\r\n        }\r\n    }\r\n\r\n    function pendingTokens(\r\n        uint256 pid,\r\n        address user,\r\n        uint256 tattooAmount\r\n    )\r\n    override\r\n    external\r\n    view\r\n    returns (IERC20[] memory, uint256[] memory)\r\n    {\r\n        //extra rewards length\r\n        uint256 length = extraRewards.length;\r\n\r\n        //combine base and extras\r\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\r\n        rewardTokens[0] = rewardToken;\r\n        for(uint i=0; i < length; i++){\r\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\r\n        }\r\n        uint256[] memory earnedAmounts = new uint256[](1+length);\r\n        earnedAmounts[0] = earned(user);\r\n        for(uint i=0; i < length; i++){\r\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\r\n        }\r\n        return (rewardTokens,earnedAmounts);\r\n    }\r\n}"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers",
            "metadata",
            "devdoc",
            "userdoc",
            "storageLayout",
            "evm.gasEstimates"
          ],
          "": [
            "ast"
          ]
        }
      },
      "metadata": {
        "useLiteralContent": true
      }
    }
  },
  "output": {
    "contracts": {
      "contracts/ConvexRewarder.sol": {
        "Address": {
          "abi": [],
          "devdoc": {
            "details": "Collection of functions related to the address type",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203bf2ac87ce395394baf359872f9e24b4d9c4cdcb27deb94d18ad545e3efabe9b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODESIZE CALLCODE 0xAC DUP8 0xCE CODECOPY MSTORE8 SWAP5 0xBA RETURN MSIZE DUP8 0x2F SWAP15 0x24 0xB4 0xD9 0xC4 0xCD 0xCB 0x27 0xDE 0xB9 0x4D XOR 0xAD SLOAD 0x5E RETURNDATACOPY STATICCALL 0xBE SWAP12 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "16693:7867:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203bf2ac87ce395394baf359872f9e24b4d9c4cdcb27deb94d18ad545e3efabe9b64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODESIZE CALLCODE 0xAC DUP8 0xCE CODECOPY MSTORE8 SWAP5 0xBA RETURN MSIZE DUP8 0x2F SWAP15 0x24 0xB4 0xD9 0xC4 0xCD 0xCB 0x27 0xDE 0xB9 0x4D XOR 0xAD SLOAD 0x5E RETURNDATACOPY STATICCALL 0xBE SWAP12 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "16693:7867:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_verifyCallResult(bool,bytes memory,string memory)": "infinite",
                "functionCall(address,bytes memory)": "infinite",
                "functionCall(address,bytes memory,string memory)": "infinite",
                "functionCallWithValue(address,bytes memory,uint256)": "infinite",
                "functionCallWithValue(address,bytes memory,uint256,string memory)": "infinite",
                "functionDelegateCall(address,bytes memory)": "infinite",
                "functionDelegateCall(address,bytes memory,string memory)": "infinite",
                "functionStaticCall(address,bytes memory)": "infinite",
                "functionStaticCall(address,bytes memory,string memory)": "infinite",
                "isContract(address)": "infinite",
                "sendValue(address payable,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"Address\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ConvexRewarder": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "stakingToken_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "rewardToken_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "rewardManager_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "tattooMasterChef_",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "convexMasterChef_",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "chefPid_",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "reward",
                  "type": "uint256"
                }
              ],
              "name": "RewardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "reward",
                  "type": "uint256"
                }
              ],
              "name": "RewardPaid",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Staked",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Withdrawn",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_reward",
                  "type": "address"
                }
              ],
              "name": "addExtraReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "chefPid",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "clearExtraRewards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "convexMasterChef",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentRewards",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "duration",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "earned",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "extraRewards",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "extraRewardsLength",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_account",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_claimExtras",
                  "type": "bool"
                }
              ],
              "name": "getReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "harvestFromMasterChef",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "dummyToken",
                  "type": "address"
                }
              ],
              "name": "init",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isInit",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "lastTimeRewardApplicable",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "lastUpdateTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "localBalanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tattooAmount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "newLpAmount",
                  "type": "uint256"
                }
              ],
              "name": "onTattooReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tattooAmount",
                  "type": "uint256"
                }
              ],
              "name": "pendingTokens",
              "outputs": [
                {
                  "internalType": "contract IERC20[]",
                  "name": "",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "periodFinish",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "previousRewardDebt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardManager",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardPerToken",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardPerTokenStored",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardRate",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardToken",
              "outputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "rewards",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "stake",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "stakeAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_for",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "stakeFor",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "stakingToken",
              "outputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "tattooBalanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tattooMasterChef",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tattooPid",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "userRewardPerTokenPaid",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "claim",
                  "type": "bool"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bool",
                  "name": "claim",
                  "type": "bool"
                }
              ],
              "name": "withdrawAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "6101406040526000808055600181905560048190556007556008805460ff1916905534801561002d57600080fd5b50604051612733380380612733833981810160405260c081101561005057600080fd5b5080516020820151604083015160608085015160808087015160a0978801516001600160601b031997851b881690985294831b8616905291811b841660c05290811b831660e0521b16610100526101205260805160601c60a05160601c60c05160601c60e05160601c6101005160601c610120516125e0610153600039806109805280610edb528061135e52806120995250806108de52806109b75280610f11528061187952806120d2525080610e5652806119015250806106f052806107725280610f83525080610bec5280610dd8528061126352806112b45280611510528061193552508061112b52806116345280611bee5280611e4852506125e06000f3fe608060405234801561001057600080fd5b506004361061023c5760003560e01c80637050ccd91161013b578063b145a5b8116100b8578063df136d651161007c578063df136d65146105f0578063e0d68925146105f8578063e24c761314610600578063ebe2b12b14610642578063f7c618c11461064a5761023c565b8063b145a5b8146104f1578063c8f33c911461050d578063cd3daf9d14610515578063d55a23f41461051d578063d63b3c49146105255761023c565b80638b876347116100ff5780638b876347146104965780638dcb4061146104bc578063901a7d53146104c457806391817d74146104cc578063a694fc3a146104d45761023c565b80637050ccd91461042a57806370a082311461045857806372f702f31461047e5780637b0a47ee1461048657806380faa57d1461048e5761023c565b80632ee40908116101c957806346c652761161018d57806346c65276146103a8578063473be90e146103b05780634f70b15a146103d65780635e43c47b146103de5780636762805c146104045761023c565b80632ee409081461032a57806338d0743614610356578063395596dd1461037b5780633d18b9121461038357806340c354461461038b5761023c565b80630fb5a6b4116102105780630fb5a6b4146102cd57806318160ddd146102d557806319ab453c146102dd5780631c1c6fe5146103035780632ae63c5b146103225761023c565b80628cc262146102415780630569d388146102795780630700037d146102835780630f4ef8a6146102a9575b600080fd5b6102676004803603602081101561025757600080fd5b50356001600160a01b0316610652565b60408051918252519081900360200190f35b6102816106e5565b005b6102676004803603602081101561029957600080fd5b50356001600160a01b031661075e565b6102b1610770565b604080516001600160a01b039092168252519081900360200190f35b610267610794565b61026761079b565b610281600480360360208110156102f357600080fd5b50356001600160a01b03166107a2565b6102816004803603602081101561031957600080fd5b50351515610a22565b610267610a3f565b6102816004803603604081101561034057600080fd5b506001600160a01b038135169060200135610a45565b6102816004803603604081101561036c57600080fd5b50803590602001351515610c50565b6102b1610e54565b610281610e78565b6102b1600480360360208110156103a157600080fd5b5035610e83565b610267610eaa565b610267600480360360208110156103c657600080fd5b50356001600160a01b0316610eb0565b610281610ecb565b610281600480360360208110156103f457600080fd5b50356001600160a01b0316610f78565b6102676004803603602081101561041a57600080fd5b50356001600160a01b0316611082565b6102816004803603604081101561044057600080fd5b506001600160a01b038135169060200135151561109d565b6102676004803603602081101561046e57600080fd5b50356001600160a01b0316611234565b6102b1611261565b610267611285565b61026761128b565b610267600480360360208110156104ac57600080fd5b50356001600160a01b031661129e565b6102816112b0565b610267611356565b61026761135c565b610281600480360360208110156104ea57600080fd5b5035611380565b6104f961157b565b604080519115158252519081900360200190f35b610267611584565b61026761158a565b6102676115dc565b6105576004803603606081101561053b57600080fd5b508035906001600160a01b0360208201351690604001356115e2565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561059b578181015183820152602001610583565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105da5781810151838201526020016105c2565b5050505090500194505050505060405180910390f35b610267611871565b6102b1611877565b610281600480360360a081101561061657600080fd5b508035906001600160a01b0360208201358116916040810135909116906060810135906080013561189b565b610267611be6565b6102b1611bec565b6001600160a01b0381166000908152600c6020908152604080832054600b9092528220546106df91906106d990670de0b6b3a7640000906106d39061069f9061069961158a565b90611c10565b6001600160a01b0388166000908152600a60209081526040808320546009909252909120546106cd91611c6d565b90611cce565b90611d27565b90611c6d565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610750576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61075c600d6000612507565b565b600c6020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6206978081565b6005545b90565b60085460ff16156107e9576040805162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b6008805460ff19166001179055604080516370a0823160e01b815233600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50519050806108b8576040805162461bcd60e51b8152602060048201526015602482015274042616c616e6365206d75737420657863656564203605c1b604482015290519081900360640190fd5b6108cd6001600160a01b038316333084611d8e565b816001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b505050506040513d602081101561096e57600080fd5b505060408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e2bbb15891604480830192600092919082900301818387803b1580156109fe57600080fd5b505af1158015610a12573d6000803e3d6000fd5b50505050610a1e611de8565b5050565b33600090815260096020526040902054610a3c9082610c50565b50565b60065481565b81610a4e61158a565b600355610a5961128b565b6002556001600160a01b03811615610aa057610a7481610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211610af5576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b610afd611f9a565b600d5460005b81811015610b9557600d8181548110610b1857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b505060019092019150610b039050565b50600554610ba39084611c6d565b6005556001600160a01b038416600090815260096020526040902054610bc99084611c6d565b6001600160a01b03808616600090815260096020526040902091909155610c14907f000000000000000000000000000000000000000000000000000000000000000016333086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250505050565b33610c5961158a565b600355610c6461128b565b6002556001600160a01b03811615610cab57610c7f81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008311610d00576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b600d5460005b81811015610d9457600d8181548110610d1b57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505060019092019150610d069050565b50600554610da29085611c10565b60055533600090815260096020526040902054610dbf9085611c10565b33600081815260096020526040902091909155610e07907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611fc7565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610e4e57610e4e33600161109d565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61075c33600161109d565b600d8181548110610e9057fe5b6000918252602090912001546001600160a01b0316905081565b60075481565b6001600160a01b03166000908152600a602052604090205490565b60408051636eeaf0d960e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ddd5e1b291604480830192600092919082900301818387803b158015610f5857600080fd5b505af1158015610f6c573d6000803e3d6000fd5b5050505061075c61201e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fe3576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038116611030576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b816110a661158a565b6003556110b161128b565b6002556001600160a01b038116156110f8576110cc81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b600061110384610652565b90508015611192576001600160a01b038085166000908152600c6020526040812055611152907f0000000000000000000000000000000000000000000000000000000000000000168583611fc7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b821561122c57600d5460005b8181101561122957600d81815481106111b357fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b50506001909201915061119e9050565b50505b610e4e611f9a565b6001600160a01b0381166000908152600a602090815260408083205460099092528220546106df91611c6d565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b600061129942600054612223565b905090565b600b6020526000908152604090205481565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561131f57600080fd5b505afa158015611333573d6000803e3d6000fd5b505050506040513d602081101561134957600080fd5b50519050610a3c81611380565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000081565b3361138961158a565b60035561139461128b565b6002556001600160a01b038116156113db576113af81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211611430576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b611438611f9a565b600d5460005b818110156114cc57600d818154811061145357fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b1580156114a857600080fd5b505af11580156114bc573d6000803e3d6000fd5b50506001909201915061143e9050565b506005546114da9084611c6d565b600555336000908152600960205260409020546114f79084611c6d565b33600081815260096020526040902091909155611540907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316903086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505050565b60085460ff1681565b60025481565b60008061159561079b565b9050806115a657505060035461079f565b6115d66115cd826106d3670de0b6b3a76400006106cd6001546106cd60025461069961128b565b60035490611c6d565b91505090565b600d5490565b600d546060908190816001820167ffffffffffffffff8111801561160557600080fd5b5060405190808252806020026020018201604052801561162f578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061166057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8281101561173e57600d818154811061169857fe5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156116e157600080fd5b505afa1580156116f5573d6000803e3d6000fd5b505050506040513d602081101561170b57600080fd5b5051825183906001840190811061171e57fe5b6001600160a01b0390921660209283029190910190910152600101611683565b5060608260010167ffffffffffffffff8111801561175b57600080fd5b50604051908082528060200260200182016040528015611785578160200160208202803683370190505b50905061179187610652565b8160008151811061179e57fe5b60200260200101818152505060005b8381101561186357600d81815481106117c257fe5b60009182526020918290200154604080516246613160e11b81526001600160a01b038c8116600483015291519190921692628cc2629260248082019391829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d602081101561183d57600080fd5b5051825183906001840190811061185057fe5b60209081029190910101526001016117ad565b509097909650945050505050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b836118a461158a565b6003556118af61128b565b6002556001600160a01b038116156118f6576118ca81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461192b57600080fd5b600654806119ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03166378ed5d1f896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156119a157600080fd5b505afa1580156119b5573d6000803e3d6000fd5b505050506040513d60208110156119cb57600080fd5b50516001600160a01b0316146119e057600080fd5b60068790556119f6565b8087146119f657600080fd5b8315611a0757611a0786600161109d565b6001600160a01b0386166000908152600a602052604090205480841115611b02576000611a348583611c10565b600d5490915060005b81811015611acf57600d8181548110611a5257fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038e81166004830152602482018890529151919092169263adc9772e926044808201939182900301818387803b158015611aab57600080fd5b505af1158015611abf573d6000803e3d6000fd5b505060019092019150611a3d9050565b50600554611add9083611c6d565b60055550506001600160a01b0387166000908152600a60205260409020849055611bdc565b80841015611bdc576000611b168286611c10565b600d5490915060005b81811015611bad57600d8181548110611b3457fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810187905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015611b8957600080fd5b505af1158015611b9d573d6000803e3d6000fd5b505060019092019150611b1f9050565b50600554611bbb9083611c10565b60055550506001600160a01b0387166000908152600a602052604090208490555b5050505050505050565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611c67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611cc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611cdd575060006106df565b82820282848281611cea57fe5b0414611cc75760405162461bcd60e51b81526004018080602001828103825260218152602001806125606021913960400191505060405180910390fd5b6000808211611d7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611d8657fe5b049392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e4e908590612239565b6000611df261158a565b600355611dfd61128b565b6002556001600160a01b03811615611e4457611e1881610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b50516000549091504210611f0057611ef88162069780611d27565b600155611f48565b60008054611f0e9042611c10565b90506000611f2760015483611cce90919063ffffffff16565b9050611f338382611c6d565b9250611f428362069780611d27565b60015550505b6004819055426002819055611f609062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008054118015611fba5750600054611fb69062015180611c10565b4210155b1561075c5761075c610ecb565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612019908490612239565b505050565b600061202861158a565b60035561203361128b565b6002556001600160a01b0381161561207a5761204e81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60085460ff1661208957610a3c565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d604081101561213e57600080fd5b5060200151600754909150600090612157908390611c10565b600783905590508061216a575050610a3c565b6000544210612188576121808162069780611d27565b6001556121d0565b600080546121969042611c10565b905060006121af60015483611cce90919063ffffffff16565b90506121bb8382611c6d565b92506121ca8362069780611d27565b60015550505b60048190554260028190556121e89062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60008183106122325781611cc7565b5090919050565b606061228e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122ea9092919063ffffffff16565b805190915015612019578080602001905160208110156122ad57600080fd5b50516120195760405162461bcd60e51b815260040180806020018281038252602a815260200180612581602a913960400191505060405180910390fd5b60606122f98484600085612301565b949350505050565b6060824710156123425760405162461bcd60e51b815260040180806020018281038252602681526020018061253a6026913960400191505060405180910390fd5b61234b8561245d565b61239c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123db5780518252601f1990920191602091820191016123bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b5091509150612452828286612463565b979650505050505050565b3b151590565b60608315612472575081611cc7565b8251156124825782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124cc5781810151838201526020016124b4565b50505050905090810190601f1680156124f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190610a3c91905b808211156125355760008155600101612521565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220798ef9ad8b64ea9bc6e803908594f171ca7f8b85c093681d96e336a8fd3fd6f564736f6c634300060c0033",
              "opcodes": "PUSH2 0x140 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 DUP1 SSTORE PUSH1 0x1 DUP2 SWAP1 SSTORE PUSH1 0x4 DUP2 SWAP1 SSTORE PUSH1 0x7 SSTORE PUSH1 0x8 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x2733 CODESIZE SUB DUP1 PUSH2 0x2733 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0xC0 DUP2 LT ISZERO PUSH2 0x50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x60 DUP1 DUP6 ADD MLOAD PUSH1 0x80 DUP1 DUP8 ADD MLOAD PUSH1 0xA0 SWAP8 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT SWAP8 DUP6 SHL DUP9 AND SWAP1 SWAP9 MSTORE SWAP5 DUP4 SHL DUP7 AND SWAP1 MSTORE SWAP2 DUP2 SHL DUP5 AND PUSH1 0xC0 MSTORE SWAP1 DUP2 SHL DUP4 AND PUSH1 0xE0 MSTORE SHL AND PUSH2 0x100 MSTORE PUSH2 0x120 MSTORE PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH1 0xE0 MLOAD PUSH1 0x60 SHR PUSH2 0x100 MLOAD PUSH1 0x60 SHR PUSH2 0x120 MLOAD PUSH2 0x25E0 PUSH2 0x153 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x980 MSTORE DUP1 PUSH2 0xEDB MSTORE DUP1 PUSH2 0x135E MSTORE DUP1 PUSH2 0x2099 MSTORE POP DUP1 PUSH2 0x8DE MSTORE DUP1 PUSH2 0x9B7 MSTORE DUP1 PUSH2 0xF11 MSTORE DUP1 PUSH2 0x1879 MSTORE DUP1 PUSH2 0x20D2 MSTORE POP DUP1 PUSH2 0xE56 MSTORE DUP1 PUSH2 0x1901 MSTORE POP DUP1 PUSH2 0x6F0 MSTORE DUP1 PUSH2 0x772 MSTORE DUP1 PUSH2 0xF83 MSTORE POP DUP1 PUSH2 0xBEC MSTORE DUP1 PUSH2 0xDD8 MSTORE DUP1 PUSH2 0x1263 MSTORE DUP1 PUSH2 0x12B4 MSTORE DUP1 PUSH2 0x1510 MSTORE DUP1 PUSH2 0x1935 MSTORE POP DUP1 PUSH2 0x112B MSTORE DUP1 PUSH2 0x1634 MSTORE DUP1 PUSH2 0x1BEE MSTORE DUP1 PUSH2 0x1E48 MSTORE POP PUSH2 0x25E0 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x23C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7050CCD9 GT PUSH2 0x13B JUMPI DUP1 PUSH4 0xB145A5B8 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xDF136D65 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xDF136D65 EQ PUSH2 0x5F0 JUMPI DUP1 PUSH4 0xE0D68925 EQ PUSH2 0x5F8 JUMPI DUP1 PUSH4 0xE24C7613 EQ PUSH2 0x600 JUMPI DUP1 PUSH4 0xEBE2B12B EQ PUSH2 0x642 JUMPI DUP1 PUSH4 0xF7C618C1 EQ PUSH2 0x64A JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0xB145A5B8 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xC8F33C91 EQ PUSH2 0x50D JUMPI DUP1 PUSH4 0xCD3DAF9D EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0xD55A23F4 EQ PUSH2 0x51D JUMPI DUP1 PUSH4 0xD63B3C49 EQ PUSH2 0x525 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x8B876347 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x8B876347 EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0x8DCB4061 EQ PUSH2 0x4BC JUMPI DUP1 PUSH4 0x901A7D53 EQ PUSH2 0x4C4 JUMPI DUP1 PUSH4 0x91817D74 EQ PUSH2 0x4CC JUMPI DUP1 PUSH4 0xA694FC3A EQ PUSH2 0x4D4 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x7050CCD9 EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0x72F702F3 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x486 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x48E JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x2EE40908 GT PUSH2 0x1C9 JUMPI DUP1 PUSH4 0x46C65276 GT PUSH2 0x18D JUMPI DUP1 PUSH4 0x46C65276 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0x473BE90E EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x4F70B15A EQ PUSH2 0x3D6 JUMPI DUP1 PUSH4 0x5E43C47B EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0x6762805C EQ PUSH2 0x404 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x2EE40908 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0x38D07436 EQ PUSH2 0x356 JUMPI DUP1 PUSH4 0x395596DD EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x3D18B912 EQ PUSH2 0x383 JUMPI DUP1 PUSH4 0x40C35446 EQ PUSH2 0x38B JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0xFB5A6B4 GT PUSH2 0x210 JUMPI DUP1 PUSH4 0xFB5A6B4 EQ PUSH2 0x2CD JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2D5 JUMPI DUP1 PUSH4 0x19AB453C EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x1C1C6FE5 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x2AE63C5B EQ PUSH2 0x322 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH3 0x8CC262 EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0x569D388 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0xF4EF8A6 EQ PUSH2 0x2A9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x652 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x281 PUSH2 0x6E5 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x75E JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x770 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x794 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7A2 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x319 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD ISZERO ISZERO PUSH2 0xA22 JUMP JUMPDEST PUSH2 0x267 PUSH2 0xA3F JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA45 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0xC50 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0xE54 JUMP JUMPDEST PUSH2 0x281 PUSH2 0xE78 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE83 JUMP JUMPDEST PUSH2 0x267 PUSH2 0xEAA JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEB0 JUMP JUMPDEST PUSH2 0x281 PUSH2 0xECB JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF78 JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1082 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x109D JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1261 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1285 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x128B JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x129E JUMP JUMPDEST PUSH2 0x281 PUSH2 0x12B0 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1356 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1380 JUMP JUMPDEST PUSH2 0x4F9 PUSH2 0x157B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x1584 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x158A JUMP JUMPDEST PUSH2 0x267 PUSH2 0x15DC JUMP JUMPDEST PUSH2 0x557 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x53B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x15E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x59B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x583 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5DA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5C2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x1871 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1877 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0x616 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x189B JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0xB SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD PUSH2 0x6DF SWAP2 SWAP1 PUSH2 0x6D9 SWAP1 PUSH8 0xDE0B6B3A7640000 SWAP1 PUSH2 0x6D3 SWAP1 PUSH2 0x69F SWAP1 PUSH2 0x699 PUSH2 0x158A JUMP JUMPDEST SWAP1 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD PUSH2 0x6CD SWAP2 PUSH2 0x1C6D JUMP JUMPDEST SWAP1 PUSH2 0x1CCE JUMP JUMPDEST SWAP1 PUSH2 0x1D27 JUMP JUMPDEST SWAP1 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH11 0x8585D5D1A1BDC9A5E9959 PUSH1 0xAA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75C PUSH1 0xD PUSH1 0x0 PUSH2 0x2507 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH3 0x69780 DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x7E9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x185B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x840 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x854 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x86A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x8B8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x42616C616E6365206D75737420657863656564203 PUSH1 0x5C SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x8CD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND CALLER ADDRESS DUP5 PUSH2 0x1D8E JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH32 0x0 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x944 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x958 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x96E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0xE2BBB158 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA12 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xA1E PUSH2 0x1DE8 JUMP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xA3C SWAP1 DUP3 PUSH2 0xC50 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST DUP2 PUSH2 0xA4E PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0xA59 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xAA0 JUMPI PUSH2 0xA74 DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP3 GT PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F74207374616B6520300000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAFD PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB95 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xB18 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP10 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB85 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xB03 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0xBA3 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xBC9 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0xC14 SWAP1 PUSH32 0x0 AND CALLER ADDRESS DUP7 PUSH2 0x1D8E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x9E71BC8EEA02A63969F509818F2DAFB9254532904319F9DBDA79B67BD34A5F3D SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST CALLER PUSH2 0xC59 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0xC64 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xCAB JUMPI PUSH2 0xC7F DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP4 GT PUSH2 0xD00 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F7420776974686472617720300000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD94 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xD1B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF3FEF3A3 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF3FEF3A3 SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD84 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xD06 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0xDA2 SWAP1 DUP6 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x5 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xDBF SWAP1 DUP6 PUSH2 0x1C10 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0xE07 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP7 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 DUP3 ISZERO PUSH2 0xE4E JUMPI PUSH2 0xE4E CALLER PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x75C CALLER PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xE90 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EEAF0D9 PUSH1 0xE1 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0xDDD5E1B2 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x75C PUSH2 0x201E JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0xFE3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH11 0x8585D5D1A1BDC9A5E9959 PUSH1 0xAA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1030 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x217265776172642073657474696E67 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xD DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xD7B6990105719101DABEB77144F2A3385C8033ACD3AF97E9423A695E81AD1EB5 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x10A6 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x10B1 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x10F8 JUMPI PUSH2 0x10CC DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x1103 DUP5 PUSH2 0x652 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x1192 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE PUSH2 0x1152 SWAP1 PUSH32 0x0 AND DUP6 DUP4 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0xE2403640BA68FED3A2F88B7557551D1993F84B99BB10FF833F0CF8DB0C5E0486 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST DUP3 ISZERO PUSH2 0x122C JUMPI PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1229 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x11B3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC00007B PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xC00007B0 SWAP3 PUSH1 0x24 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1205 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1219 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x119E SWAP1 POP JUMP JUMPDEST POP POP JUMPDEST PUSH2 0xE4E PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD PUSH2 0x6DF SWAP2 PUSH2 0x1C6D JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1299 TIMESTAMP PUSH1 0x0 SLOAD PUSH2 0x2223 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 CALLER PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x131F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1333 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1349 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH2 0xA3C DUP2 PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST CALLER PUSH2 0x1389 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1394 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x13DB JUMPI PUSH2 0x13AF DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP3 GT PUSH2 0x1430 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F74207374616B6520300000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1438 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x14CC JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1453 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x14BC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x143E SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x14DA SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x14F7 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x1540 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 ADDRESS DUP7 PUSH2 0x1D8E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x9E71BC8EEA02A63969F509818F2DAFB9254532904319F9DBDA79B67BD34A5F3D SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1595 PUSH2 0x79B JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x15A6 JUMPI POP POP PUSH1 0x3 SLOAD PUSH2 0x79F JUMP JUMPDEST PUSH2 0x15D6 PUSH2 0x15CD DUP3 PUSH2 0x6D3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x6CD PUSH1 0x1 SLOAD PUSH2 0x6CD PUSH1 0x2 SLOAD PUSH2 0x699 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1C6D JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x60 SWAP1 DUP2 SWAP1 DUP2 PUSH1 0x1 DUP3 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1605 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x162F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH32 0x0 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1660 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x173E JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1698 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF7C618C1 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF7C618C1 SWAP3 PUSH1 0x4 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x16F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x170B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP3 MLOAD DUP4 SWAP1 PUSH1 0x1 DUP5 ADD SWAP1 DUP2 LT PUSH2 0x171E JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1683 JUMP JUMPDEST POP PUSH1 0x60 DUP3 PUSH1 0x1 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x175B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1785 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x1791 DUP8 PUSH2 0x652 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x179E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1863 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x17C2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x466131 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP13 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH3 0x8CC262 SWAP3 PUSH1 0x24 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1813 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1827 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x183D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP3 MLOAD DUP4 SWAP1 PUSH1 0x1 DUP5 ADD SWAP1 DUP2 LT PUSH2 0x1850 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x17AD JUMP JUMPDEST POP SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP4 PUSH2 0x18A4 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x18AF PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x18F6 JUMPI PUSH2 0x18CA DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD DUP1 PUSH2 0x19EA JUMPI PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x78ED5D1F DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x19B5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x19E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP8 SWAP1 SSTORE PUSH2 0x19F6 JUMP JUMPDEST DUP1 DUP8 EQ PUSH2 0x19F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ISZERO PUSH2 0x1A07 JUMPI PUSH2 0x1A07 DUP7 PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 DUP5 GT ISZERO PUSH2 0x1B02 JUMPI PUSH1 0x0 PUSH2 0x1A34 DUP6 DUP4 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1ACF JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1A52 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP15 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP9 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1ABF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1A3D SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x1ADD SWAP1 DUP4 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE PUSH2 0x1BDC JUMP JUMPDEST DUP1 DUP5 LT ISZERO PUSH2 0x1BDC JUMPI PUSH1 0x0 PUSH2 0x1B16 DUP3 DUP7 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1BAD JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1B34 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF3FEF3A3 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF3FEF3A3 SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1B9D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1B1F SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x1BBB SWAP1 DUP4 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x5 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1C67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1CC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1CDD JUMPI POP PUSH1 0x0 PUSH2 0x6DF JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1CEA JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1CC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2560 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x1D7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x1D86 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE4E SWAP1 DUP6 SWAP1 PUSH2 0x2239 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DF2 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1DFD PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1E44 JUMPI PUSH2 0x1E18 DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EC7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1EDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SLOAD SWAP1 SWAP2 POP TIMESTAMP LT PUSH2 0x1F00 JUMPI PUSH2 0x1EF8 DUP2 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE PUSH2 0x1F48 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH2 0x1F0E SWAP1 TIMESTAMP PUSH2 0x1C10 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1F27 PUSH1 0x1 SLOAD DUP4 PUSH2 0x1CCE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1F33 DUP4 DUP3 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 POP PUSH2 0x1F42 DUP4 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE POP POP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH2 0x1F60 SWAP1 PUSH3 0x69780 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x0 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xDE88A922E0D3B88B24E9623EFEB464919C6BF9F66857A65E2BFCF2CE87A9433D SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD GT DUP1 ISZERO PUSH2 0x1FBA JUMPI POP PUSH1 0x0 SLOAD PUSH2 0x1FB6 SWAP1 PUSH3 0x15180 PUSH2 0x1C10 JUMP JUMPDEST TIMESTAMP LT ISZERO JUMPDEST ISZERO PUSH2 0x75C JUMPI PUSH2 0x75C PUSH2 0xECB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0x2019 SWAP1 DUP5 SWAP1 PUSH2 0x2239 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2028 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x2033 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x207A JUMPI PUSH2 0x204E DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND PUSH2 0x2089 JUMPI PUSH2 0xA3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x93F1A40B PUSH1 0xE0 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE DUP2 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP3 PUSH4 0x93F1A40B SWAP3 PUSH1 0x44 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2128 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x213E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 ADD MLOAD PUSH1 0x7 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2157 SWAP1 DUP4 SWAP1 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x7 DUP4 SWAP1 SSTORE SWAP1 POP DUP1 PUSH2 0x216A JUMPI POP POP PUSH2 0xA3C JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT PUSH2 0x2188 JUMPI PUSH2 0x2180 DUP2 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE PUSH2 0x21D0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH2 0x2196 SWAP1 TIMESTAMP PUSH2 0x1C10 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x21AF PUSH1 0x1 SLOAD DUP4 PUSH2 0x1CCE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x21BB DUP4 DUP3 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 POP PUSH2 0x21CA DUP4 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE POP POP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH2 0x21E8 SWAP1 PUSH3 0x69780 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x0 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xDE88A922E0D3B88B24E9623EFEB464919C6BF9F66857A65E2BFCF2CE87A9433D SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2232 JUMPI DUP2 PUSH2 0x1CC7 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x228E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22EA SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x2019 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x22AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x2019 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2581 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 PUSH2 0x22F9 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x2301 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x2342 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x253A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x234B DUP6 PUSH2 0x245D JUMP JUMPDEST PUSH2 0x239C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x23DB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x23BC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x243D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2442 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x2452 DUP3 DUP3 DUP7 PUSH2 0x2463 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2472 JUMPI POP DUP2 PUSH2 0x1CC7 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x2482 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x24CC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x24B4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x24F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xA3C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2535 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2521 JUMP JUMPDEST POP SWAP1 JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C53616665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F77536166654552433230 GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x756363656564A2646970667358221220798EF9AD DUP12 PUSH5 0xEA9BC6E803 SWAP1 DUP6 SWAP5 CALL PUSH18 0xCA7F8B85C093681D96E336A8FD3FD6F56473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "30571:13398:0:-:0;;;31035:1;31005:31;;;31043:29;;;;31157:33;;;;31263:37;;31307:26;;;-1:-1:-1;;31307:26:0;;;31825:485;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31825:485:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32057:36:0;;;;;;;;32104:34;;;;;;;32149:30;;;;;31825:485;32149:30;32190:36;;;;;;;32237;;;;32284:18;;30571:13398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {
                "1665": [
                  {
                    "length": 32,
                    "start": 4395
                  },
                  {
                    "length": 32,
                    "start": 5684
                  },
                  {
                    "length": 32,
                    "start": 7150
                  },
                  {
                    "length": 32,
                    "start": 7752
                  }
                ],
                "1667": [
                  {
                    "length": 32,
                    "start": 3052
                  },
                  {
                    "length": 32,
                    "start": 3544
                  },
                  {
                    "length": 32,
                    "start": 4707
                  },
                  {
                    "length": 32,
                    "start": 4788
                  },
                  {
                    "length": 32,
                    "start": 5392
                  },
                  {
                    "length": 32,
                    "start": 6453
                  }
                ],
                "1672": [
                  {
                    "length": 32,
                    "start": 1776
                  },
                  {
                    "length": 32,
                    "start": 1906
                  },
                  {
                    "length": 32,
                    "start": 3971
                  }
                ],
                "1674": [
                  {
                    "length": 32,
                    "start": 3670
                  },
                  {
                    "length": 32,
                    "start": 6401
                  }
                ],
                "1676": [
                  {
                    "length": 32,
                    "start": 2270
                  },
                  {
                    "length": 32,
                    "start": 2487
                  },
                  {
                    "length": 32,
                    "start": 3857
                  },
                  {
                    "length": 32,
                    "start": 6265
                  },
                  {
                    "length": 32,
                    "start": 8402
                  }
                ],
                "1678": [
                  {
                    "length": 32,
                    "start": 2432
                  },
                  {
                    "length": 32,
                    "start": 3803
                  },
                  {
                    "length": 32,
                    "start": 4958
                  },
                  {
                    "length": 32,
                    "start": 8345
                  }
                ]
              },
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061023c5760003560e01c80637050ccd91161013b578063b145a5b8116100b8578063df136d651161007c578063df136d65146105f0578063e0d68925146105f8578063e24c761314610600578063ebe2b12b14610642578063f7c618c11461064a5761023c565b8063b145a5b8146104f1578063c8f33c911461050d578063cd3daf9d14610515578063d55a23f41461051d578063d63b3c49146105255761023c565b80638b876347116100ff5780638b876347146104965780638dcb4061146104bc578063901a7d53146104c457806391817d74146104cc578063a694fc3a146104d45761023c565b80637050ccd91461042a57806370a082311461045857806372f702f31461047e5780637b0a47ee1461048657806380faa57d1461048e5761023c565b80632ee40908116101c957806346c652761161018d57806346c65276146103a8578063473be90e146103b05780634f70b15a146103d65780635e43c47b146103de5780636762805c146104045761023c565b80632ee409081461032a57806338d0743614610356578063395596dd1461037b5780633d18b9121461038357806340c354461461038b5761023c565b80630fb5a6b4116102105780630fb5a6b4146102cd57806318160ddd146102d557806319ab453c146102dd5780631c1c6fe5146103035780632ae63c5b146103225761023c565b80628cc262146102415780630569d388146102795780630700037d146102835780630f4ef8a6146102a9575b600080fd5b6102676004803603602081101561025757600080fd5b50356001600160a01b0316610652565b60408051918252519081900360200190f35b6102816106e5565b005b6102676004803603602081101561029957600080fd5b50356001600160a01b031661075e565b6102b1610770565b604080516001600160a01b039092168252519081900360200190f35b610267610794565b61026761079b565b610281600480360360208110156102f357600080fd5b50356001600160a01b03166107a2565b6102816004803603602081101561031957600080fd5b50351515610a22565b610267610a3f565b6102816004803603604081101561034057600080fd5b506001600160a01b038135169060200135610a45565b6102816004803603604081101561036c57600080fd5b50803590602001351515610c50565b6102b1610e54565b610281610e78565b6102b1600480360360208110156103a157600080fd5b5035610e83565b610267610eaa565b610267600480360360208110156103c657600080fd5b50356001600160a01b0316610eb0565b610281610ecb565b610281600480360360208110156103f457600080fd5b50356001600160a01b0316610f78565b6102676004803603602081101561041a57600080fd5b50356001600160a01b0316611082565b6102816004803603604081101561044057600080fd5b506001600160a01b038135169060200135151561109d565b6102676004803603602081101561046e57600080fd5b50356001600160a01b0316611234565b6102b1611261565b610267611285565b61026761128b565b610267600480360360208110156104ac57600080fd5b50356001600160a01b031661129e565b6102816112b0565b610267611356565b61026761135c565b610281600480360360208110156104ea57600080fd5b5035611380565b6104f961157b565b604080519115158252519081900360200190f35b610267611584565b61026761158a565b6102676115dc565b6105576004803603606081101561053b57600080fd5b508035906001600160a01b0360208201351690604001356115e2565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561059b578181015183820152602001610583565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156105da5781810151838201526020016105c2565b5050505090500194505050505060405180910390f35b610267611871565b6102b1611877565b610281600480360360a081101561061657600080fd5b508035906001600160a01b0360208201358116916040810135909116906060810135906080013561189b565b610267611be6565b6102b1611bec565b6001600160a01b0381166000908152600c6020908152604080832054600b9092528220546106df91906106d990670de0b6b3a7640000906106d39061069f9061069961158a565b90611c10565b6001600160a01b0388166000908152600a60209081526040808320546009909252909120546106cd91611c6d565b90611cce565b90611d27565b90611c6d565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610750576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b61075c600d6000612507565b565b600c6020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6206978081565b6005545b90565b60085460ff16156107e9576040805162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b6008805460ff19166001179055604080516370a0823160e01b815233600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50519050806108b8576040805162461bcd60e51b8152602060048201526015602482015274042616c616e6365206d75737420657863656564203605c1b604482015290519081900360640190fd5b6108cd6001600160a01b038316333084611d8e565b816001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561094457600080fd5b505af1158015610958573d6000803e3d6000fd5b505050506040513d602081101561096e57600080fd5b505060408051631c57762b60e31b81527f000000000000000000000000000000000000000000000000000000000000000060048201526024810183905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e2bbb15891604480830192600092919082900301818387803b1580156109fe57600080fd5b505af1158015610a12573d6000803e3d6000fd5b50505050610a1e611de8565b5050565b33600090815260096020526040902054610a3c9082610c50565b50565b60065481565b81610a4e61158a565b600355610a5961128b565b6002556001600160a01b03811615610aa057610a7481610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211610af5576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b610afd611f9a565b600d5460005b81811015610b9557600d8181548110610b1857fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038981166004830152602482018990529151919092169263adc9772e926044808201939182900301818387803b158015610b7157600080fd5b505af1158015610b85573d6000803e3d6000fd5b505060019092019150610b039050565b50600554610ba39084611c6d565b6005556001600160a01b038416600090815260096020526040902054610bc99084611c6d565b6001600160a01b03808616600090815260096020526040902091909155610c14907f000000000000000000000000000000000000000000000000000000000000000016333086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a250505050565b33610c5961158a565b600355610c6461128b565b6002556001600160a01b03811615610cab57610c7f81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008311610d00576040805162461bcd60e51b815260206004820152601e60248201527f526577617264506f6f6c203a2043616e6e6f7420776974686472617720300000604482015290519081900360640190fd5b600d5460005b81811015610d9457600d8181548110610d1b57fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810189905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b505060019092019150610d069050565b50600554610da29085611c10565b60055533600090815260096020526040902054610dbf9085611c10565b33600081815260096020526040902091909155610e07907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169086611fc7565b60408051858152905133917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a28215610e4e57610e4e33600161109d565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61075c33600161109d565b600d8181548110610e9057fe5b6000918252602090912001546001600160a01b0316905081565b60075481565b6001600160a01b03166000908152600a602052604090205490565b60408051636eeaf0d960e11b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ddd5e1b291604480830192600092919082900301818387803b158015610f5857600080fd5b505af1158015610f6c573d6000803e3d6000fd5b5050505061075c61201e565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fe3576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b6001600160a01b038116611030576040805162461bcd60e51b815260206004820152600f60248201526e217265776172642073657474696e6760881b604482015290519081900360640190fd5b600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b816110a661158a565b6003556110b161128b565b6002556001600160a01b038116156110f8576110cc81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b600061110384610652565b90508015611192576001600160a01b038085166000908152600c6020526040812055611152907f0000000000000000000000000000000000000000000000000000000000000000168583611fc7565b6040805182815290516001600160a01b038616917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a25b821561122c57600d5460005b8181101561122957600d81815481106111b357fe5b600091825260208220015460408051630c00007b60e41b81526001600160a01b038a811660048301529151919092169263c00007b0926024808201939182900301818387803b15801561120557600080fd5b505af1158015611219573d6000803e3d6000fd5b50506001909201915061119e9050565b50505b610e4e611f9a565b6001600160a01b0381166000908152600a602090815260408083205460099092528220546106df91611c6d565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b600061129942600054612223565b905090565b600b6020526000908152604090205481565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561131f57600080fd5b505afa158015611333573d6000803e3d6000fd5b505050506040513d602081101561134957600080fd5b50519050610a3c81611380565b60045481565b7f000000000000000000000000000000000000000000000000000000000000000081565b3361138961158a565b60035561139461128b565b6002556001600160a01b038116156113db576113af81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60008211611430576040805162461bcd60e51b815260206004820152601b60248201527f526577617264506f6f6c203a2043616e6e6f74207374616b6520300000000000604482015290519081900360640190fd5b611438611f9a565b600d5460005b818110156114cc57600d818154811061145357fe5b6000918252602082200154604080516356e4bb9760e11b81523360048201526024810188905290516001600160a01b039092169263adc9772e9260448084019382900301818387803b1580156114a857600080fd5b505af11580156114bc573d6000803e3d6000fd5b50506001909201915061143e9050565b506005546114da9084611c6d565b600555336000908152600960205260409020546114f79084611c6d565b33600081815260096020526040902091909155611540907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316903086611d8e565b60408051848152905133917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a2505050565b60085460ff1681565b60025481565b60008061159561079b565b9050806115a657505060035461079f565b6115d66115cd826106d3670de0b6b3a76400006106cd6001546106cd60025461069961128b565b60035490611c6d565b91505090565b600d5490565b600d546060908190816001820167ffffffffffffffff8111801561160557600080fd5b5060405190808252806020026020018201604052801561162f578160200160208202803683370190505b5090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061166057fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b8281101561173e57600d818154811061169857fe5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156116e157600080fd5b505afa1580156116f5573d6000803e3d6000fd5b505050506040513d602081101561170b57600080fd5b5051825183906001840190811061171e57fe5b6001600160a01b0390921660209283029190910190910152600101611683565b5060608260010167ffffffffffffffff8111801561175b57600080fd5b50604051908082528060200260200182016040528015611785578160200160208202803683370190505b50905061179187610652565b8160008151811061179e57fe5b60200260200101818152505060005b8381101561186357600d81815481106117c257fe5b60009182526020918290200154604080516246613160e11b81526001600160a01b038c8116600483015291519190921692628cc2629260248082019391829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d602081101561183d57600080fd5b5051825183906001840190811061185057fe5b60209081029190910101526001016117ad565b509097909650945050505050565b60035481565b7f000000000000000000000000000000000000000000000000000000000000000081565b836118a461158a565b6003556118af61128b565b6002556001600160a01b038116156118f6576118ca81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461192b57600080fd5b600654806119ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316336001600160a01b03166378ed5d1f896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156119a157600080fd5b505afa1580156119b5573d6000803e3d6000fd5b505050506040513d60208110156119cb57600080fd5b50516001600160a01b0316146119e057600080fd5b60068790556119f6565b8087146119f657600080fd5b8315611a0757611a0786600161109d565b6001600160a01b0386166000908152600a602052604090205480841115611b02576000611a348583611c10565b600d5490915060005b81811015611acf57600d8181548110611a5257fe5b6000918252602082200154604080516356e4bb9760e11b81526001600160a01b038e81166004830152602482018890529151919092169263adc9772e926044808201939182900301818387803b158015611aab57600080fd5b505af1158015611abf573d6000803e3d6000fd5b505060019092019150611a3d9050565b50600554611add9083611c6d565b60055550506001600160a01b0387166000908152600a60205260409020849055611bdc565b80841015611bdc576000611b168286611c10565b600d5490915060005b81811015611bad57600d8181548110611b3457fe5b60009182526020822001546040805163f3fef3a360e01b81523360048201526024810187905290516001600160a01b039092169263f3fef3a39260448084019382900301818387803b158015611b8957600080fd5b505af1158015611b9d573d6000803e3d6000fd5b505060019092019150611b1f9050565b50600554611bbb9083611c10565b60055550506001600160a01b0387166000908152600a602052604090208490555b5050505050505050565b60005481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082821115611c67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611cc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611cdd575060006106df565b82820282848281611cea57fe5b0414611cc75760405162461bcd60e51b81526004018080602001828103825260218152602001806125606021913960400191505060405180910390fd5b6000808211611d7d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611d8657fe5b049392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e4e908590612239565b6000611df261158a565b600355611dfd61128b565b6002556001600160a01b03811615611e4457611e1881610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611eb357600080fd5b505afa158015611ec7573d6000803e3d6000fd5b505050506040513d6020811015611edd57600080fd5b50516000549091504210611f0057611ef88162069780611d27565b600155611f48565b60008054611f0e9042611c10565b90506000611f2760015483611cce90919063ffffffff16565b9050611f338382611c6d565b9250611f428362069780611d27565b60015550505b6004819055426002819055611f609062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a15050565b60008054118015611fba5750600054611fb69062015180611c10565b4210155b1561075c5761075c610ecb565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612019908490612239565b505050565b600061202861158a565b60035561203361128b565b6002556001600160a01b0381161561207a5761204e81610652565b6001600160a01b0382166000908152600c6020908152604080832093909355600354600b909152919020555b60085460ff1661208957610a3c565b604080516393f1a40b60e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015230602482015281516000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926393f1a40b9260448083019392829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d604081101561213e57600080fd5b5060200151600754909150600090612157908390611c10565b600783905590508061216a575050610a3c565b6000544210612188576121808162069780611d27565b6001556121d0565b600080546121969042611c10565b905060006121af60015483611cce90919063ffffffff16565b90506121bb8382611c6d565b92506121ca8362069780611d27565b60015550505b60048190554260028190556121e89062069780611c6d565b6000556040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a1505050565b60008183106122325781611cc7565b5090919050565b606061228e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122ea9092919063ffffffff16565b805190915015612019578080602001905160208110156122ad57600080fd5b50516120195760405162461bcd60e51b815260040180806020018281038252602a815260200180612581602a913960400191505060405180910390fd5b60606122f98484600085612301565b949350505050565b6060824710156123425760405162461bcd60e51b815260040180806020018281038252602681526020018061253a6026913960400191505060405180910390fd5b61234b8561245d565b61239c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123db5780518252601f1990920191602091820191016123bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461243d576040519150601f19603f3d011682016040523d82523d6000602084013e612442565b606091505b5091509150612452828286612463565b979650505050505050565b3b151590565b60608315612472575081611cc7565b8251156124825782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124cc5781810151838201526020016124b4565b50505050905090810190601f1680156124f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5080546000825590600052602060002090810190610a3c91905b808211156125355760008155600101612521565b509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220798ef9ad8b64ea9bc6e803908594f171ca7f8b85c093681d96e336a8fd3fd6f564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x23C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7050CCD9 GT PUSH2 0x13B JUMPI DUP1 PUSH4 0xB145A5B8 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xDF136D65 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xDF136D65 EQ PUSH2 0x5F0 JUMPI DUP1 PUSH4 0xE0D68925 EQ PUSH2 0x5F8 JUMPI DUP1 PUSH4 0xE24C7613 EQ PUSH2 0x600 JUMPI DUP1 PUSH4 0xEBE2B12B EQ PUSH2 0x642 JUMPI DUP1 PUSH4 0xF7C618C1 EQ PUSH2 0x64A JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0xB145A5B8 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xC8F33C91 EQ PUSH2 0x50D JUMPI DUP1 PUSH4 0xCD3DAF9D EQ PUSH2 0x515 JUMPI DUP1 PUSH4 0xD55A23F4 EQ PUSH2 0x51D JUMPI DUP1 PUSH4 0xD63B3C49 EQ PUSH2 0x525 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x8B876347 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x8B876347 EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0x8DCB4061 EQ PUSH2 0x4BC JUMPI DUP1 PUSH4 0x901A7D53 EQ PUSH2 0x4C4 JUMPI DUP1 PUSH4 0x91817D74 EQ PUSH2 0x4CC JUMPI DUP1 PUSH4 0xA694FC3A EQ PUSH2 0x4D4 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x7050CCD9 EQ PUSH2 0x42A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x458 JUMPI DUP1 PUSH4 0x72F702F3 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0x7B0A47EE EQ PUSH2 0x486 JUMPI DUP1 PUSH4 0x80FAA57D EQ PUSH2 0x48E JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x2EE40908 GT PUSH2 0x1C9 JUMPI DUP1 PUSH4 0x46C65276 GT PUSH2 0x18D JUMPI DUP1 PUSH4 0x46C65276 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0x473BE90E EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x4F70B15A EQ PUSH2 0x3D6 JUMPI DUP1 PUSH4 0x5E43C47B EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0x6762805C EQ PUSH2 0x404 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0x2EE40908 EQ PUSH2 0x32A JUMPI DUP1 PUSH4 0x38D07436 EQ PUSH2 0x356 JUMPI DUP1 PUSH4 0x395596DD EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x3D18B912 EQ PUSH2 0x383 JUMPI DUP1 PUSH4 0x40C35446 EQ PUSH2 0x38B JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH4 0xFB5A6B4 GT PUSH2 0x210 JUMPI DUP1 PUSH4 0xFB5A6B4 EQ PUSH2 0x2CD JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x2D5 JUMPI DUP1 PUSH4 0x19AB453C EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x1C1C6FE5 EQ PUSH2 0x303 JUMPI DUP1 PUSH4 0x2AE63C5B EQ PUSH2 0x322 JUMPI PUSH2 0x23C JUMP JUMPDEST DUP1 PUSH3 0x8CC262 EQ PUSH2 0x241 JUMPI DUP1 PUSH4 0x569D388 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x700037D EQ PUSH2 0x283 JUMPI DUP1 PUSH4 0xF4EF8A6 EQ PUSH2 0x2A9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x652 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x281 PUSH2 0x6E5 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x75E JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x770 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x794 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x79B JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7A2 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x319 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD ISZERO ISZERO PUSH2 0xA22 JUMP JUMPDEST PUSH2 0x267 PUSH2 0xA3F JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x340 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA45 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0xC50 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0xE54 JUMP JUMPDEST PUSH2 0x281 PUSH2 0xE78 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE83 JUMP JUMPDEST PUSH2 0x267 PUSH2 0xEAA JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEB0 JUMP JUMPDEST PUSH2 0x281 PUSH2 0xECB JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF78 JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1082 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x109D JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x46E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1234 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1261 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1285 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x128B JUMP JUMPDEST PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x129E JUMP JUMPDEST PUSH2 0x281 PUSH2 0x12B0 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1356 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1380 JUMP JUMPDEST PUSH2 0x4F9 PUSH2 0x157B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x1584 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x158A JUMP JUMPDEST PUSH2 0x267 PUSH2 0x15DC JUMP JUMPDEST PUSH2 0x557 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x53B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x15E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x59B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x583 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5DA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5C2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x267 PUSH2 0x1871 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1877 JUMP JUMPDEST PUSH2 0x281 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0x616 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x189B JUMP JUMPDEST PUSH2 0x267 PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x2B1 PUSH2 0x1BEC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0xB SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD PUSH2 0x6DF SWAP2 SWAP1 PUSH2 0x6D9 SWAP1 PUSH8 0xDE0B6B3A7640000 SWAP1 PUSH2 0x6D3 SWAP1 PUSH2 0x69F SWAP1 PUSH2 0x699 PUSH2 0x158A JUMP JUMPDEST SWAP1 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x9 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD PUSH2 0x6CD SWAP2 PUSH2 0x1C6D JUMP JUMPDEST SWAP1 PUSH2 0x1CCE JUMP JUMPDEST SWAP1 PUSH2 0x1D27 JUMP JUMPDEST SWAP1 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x750 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH11 0x8585D5D1A1BDC9A5E9959 PUSH1 0xAA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75C PUSH1 0xD PUSH1 0x0 PUSH2 0x2507 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH3 0x69780 DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x7E9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x185B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x8 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x840 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x854 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x86A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x8B8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x42616C616E6365206D75737420657863656564203 PUSH1 0x5C SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x8CD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND CALLER ADDRESS DUP5 PUSH2 0x1D8E JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x95EA7B3 PUSH32 0x0 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x944 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x958 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x96E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0xE2BBB158 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA12 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0xA1E PUSH2 0x1DE8 JUMP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xA3C SWAP1 DUP3 PUSH2 0xC50 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST DUP2 PUSH2 0xA4E PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0xA59 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xAA0 JUMPI PUSH2 0xA74 DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP3 GT PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F74207374616B6520300000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAFD PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xB95 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xB18 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP10 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB85 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xB03 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0xBA3 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xBC9 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0xC14 SWAP1 PUSH32 0x0 AND CALLER ADDRESS DUP7 PUSH2 0x1D8E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x9E71BC8EEA02A63969F509818F2DAFB9254532904319F9DBDA79B67BD34A5F3D SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST CALLER PUSH2 0xC59 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0xC64 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0xCAB JUMPI PUSH2 0xC7F DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP4 GT PUSH2 0xD00 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F7420776974686472617720300000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD94 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xD1B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF3FEF3A3 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF3FEF3A3 SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD84 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0xD06 SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0xDA2 SWAP1 DUP6 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x5 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xDBF SWAP1 DUP6 PUSH2 0x1C10 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0xE07 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP7 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 DUP3 ISZERO PUSH2 0xE4E JUMPI PUSH2 0xE4E CALLER PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH2 0x75C CALLER PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xE90 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EEAF0D9 PUSH1 0xE1 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP2 PUSH4 0xDDD5E1B2 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x75C PUSH2 0x201E JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0xFE3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xB PUSH1 0x24 DUP3 ADD MSTORE PUSH11 0x8585D5D1A1BDC9A5E9959 PUSH1 0xAA SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1030 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x217265776172642073657474696E67 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0xD DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0xD7B6990105719101DABEB77144F2A3385C8033ACD3AF97E9423A695E81AD1EB5 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST DUP2 PUSH2 0x10A6 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x10B1 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x10F8 JUMPI PUSH2 0x10CC DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x1103 DUP5 PUSH2 0x652 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x1192 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SSTORE PUSH2 0x1152 SWAP1 PUSH32 0x0 AND DUP6 DUP4 PUSH2 0x1FC7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0xE2403640BA68FED3A2F88B7557551D1993F84B99BB10FF833F0CF8DB0C5E0486 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST DUP3 ISZERO PUSH2 0x122C JUMPI PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1229 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x11B3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC00007B PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xC00007B0 SWAP3 PUSH1 0x24 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1205 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1219 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x119E SWAP1 POP JUMP JUMPDEST POP POP JUMPDEST PUSH2 0xE4E PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SLOAD PUSH1 0x9 SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD PUSH2 0x6DF SWAP2 PUSH2 0x1C6D JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1299 TIMESTAMP PUSH1 0x0 SLOAD PUSH2 0x2223 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0xB PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 CALLER PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x131F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1333 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1349 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH2 0xA3C DUP2 PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST CALLER PUSH2 0x1389 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1394 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x13DB JUMPI PUSH2 0x13AF DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 DUP3 GT PUSH2 0x1430 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x526577617264506F6F6C203A2043616E6E6F74207374616B6520300000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1438 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x14CC JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1453 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x14A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x14BC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x143E SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x14DA SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x14F7 SWAP1 DUP5 PUSH2 0x1C6D JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x1540 SWAP1 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 ADDRESS DUP7 PUSH2 0x1D8E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x9E71BC8EEA02A63969F509818F2DAFB9254532904319F9DBDA79B67BD34A5F3D SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1595 PUSH2 0x79B JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x15A6 JUMPI POP POP PUSH1 0x3 SLOAD PUSH2 0x79F JUMP JUMPDEST PUSH2 0x15D6 PUSH2 0x15CD DUP3 PUSH2 0x6D3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x6CD PUSH1 0x1 SLOAD PUSH2 0x6CD PUSH1 0x2 SLOAD PUSH2 0x699 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 PUSH2 0x1C6D JUMP JUMPDEST SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD PUSH1 0x60 SWAP1 DUP2 SWAP1 DUP2 PUSH1 0x1 DUP3 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1605 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x162F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH32 0x0 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x1660 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x173E JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1698 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF7C618C1 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF7C618C1 SWAP3 PUSH1 0x4 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x16F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x170B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP3 MLOAD DUP4 SWAP1 PUSH1 0x1 DUP5 ADD SWAP1 DUP2 LT PUSH2 0x171E JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1683 JUMP JUMPDEST POP PUSH1 0x60 DUP3 PUSH1 0x1 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x175B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1785 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH2 0x1791 DUP8 PUSH2 0x652 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x179E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1863 JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x17C2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x466131 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP13 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH3 0x8CC262 SWAP3 PUSH1 0x24 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1813 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1827 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x183D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP3 MLOAD DUP4 SWAP1 PUSH1 0x1 DUP5 ADD SWAP1 DUP2 LT PUSH2 0x1850 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x17AD JUMP JUMPDEST POP SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST DUP4 PUSH2 0x18A4 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x18AF PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x18F6 JUMPI PUSH2 0x18CA DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0x192B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD DUP1 PUSH2 0x19EA JUMPI PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x78ED5D1F DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x19B5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x19CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x19E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP8 SWAP1 SSTORE PUSH2 0x19F6 JUMP JUMPDEST DUP1 DUP8 EQ PUSH2 0x19F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ISZERO PUSH2 0x1A07 JUMPI PUSH2 0x1A07 DUP7 PUSH1 0x1 PUSH2 0x109D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP1 DUP5 GT ISZERO PUSH2 0x1B02 JUMPI PUSH1 0x0 PUSH2 0x1A34 DUP6 DUP4 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1ACF JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1A52 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x56E4BB97 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP15 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP9 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0xADC9772E SWAP3 PUSH1 0x44 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1ABF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1A3D SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x1ADD SWAP1 DUP4 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x5 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE PUSH2 0x1BDC JUMP JUMPDEST DUP1 DUP5 LT ISZERO PUSH2 0x1BDC JUMPI PUSH1 0x0 PUSH2 0x1B16 DUP3 DUP7 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 SWAP2 POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1BAD JUMPI PUSH1 0xD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x1B34 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF3FEF3A3 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH4 0xF3FEF3A3 SWAP3 PUSH1 0x44 DUP1 DUP5 ADD SWAP4 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1B9D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x1B1F SWAP1 POP JUMP JUMPDEST POP PUSH1 0x5 SLOAD PUSH2 0x1BBB SWAP1 DUP4 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x5 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1C67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1CC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1CDD JUMPI POP PUSH1 0x0 PUSH2 0x6DF JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1CEA JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1CC7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2560 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x1D7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x1D86 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE4E SWAP1 DUP6 SWAP1 PUSH2 0x2239 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1DF2 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x1DFD PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x1E44 JUMPI PUSH2 0x1E18 DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1EC7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1EDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SLOAD SWAP1 SWAP2 POP TIMESTAMP LT PUSH2 0x1F00 JUMPI PUSH2 0x1EF8 DUP2 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE PUSH2 0x1F48 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH2 0x1F0E SWAP1 TIMESTAMP PUSH2 0x1C10 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1F27 PUSH1 0x1 SLOAD DUP4 PUSH2 0x1CCE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1F33 DUP4 DUP3 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 POP PUSH2 0x1F42 DUP4 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE POP POP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH2 0x1F60 SWAP1 PUSH3 0x69780 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x0 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xDE88A922E0D3B88B24E9623EFEB464919C6BF9F66857A65E2BFCF2CE87A9433D SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD GT DUP1 ISZERO PUSH2 0x1FBA JUMPI POP PUSH1 0x0 SLOAD PUSH2 0x1FB6 SWAP1 PUSH3 0x15180 PUSH2 0x1C10 JUMP JUMPDEST TIMESTAMP LT ISZERO JUMPDEST ISZERO PUSH2 0x75C JUMPI PUSH2 0x75C PUSH2 0xECB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0x2019 SWAP1 DUP5 SWAP1 PUSH2 0x2239 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2028 PUSH2 0x158A JUMP JUMPDEST PUSH1 0x3 SSTORE PUSH2 0x2033 PUSH2 0x128B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO PUSH2 0x207A JUMPI PUSH2 0x204E DUP2 PUSH2 0x652 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xC PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE PUSH1 0x3 SLOAD PUSH1 0xB SWAP1 SWAP2 MSTORE SWAP2 SWAP1 KECCAK256 SSTORE JUMPDEST PUSH1 0x8 SLOAD PUSH1 0xFF AND PUSH2 0x2089 JUMPI PUSH2 0xA3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x93F1A40B PUSH1 0xE0 SHL DUP2 MSTORE PUSH32 0x0 PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE DUP2 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP3 PUSH4 0x93F1A40B SWAP3 PUSH1 0x44 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2114 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2128 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x213E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 ADD MLOAD PUSH1 0x7 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x2157 SWAP1 DUP4 SWAP1 PUSH2 0x1C10 JUMP JUMPDEST PUSH1 0x7 DUP4 SWAP1 SSTORE SWAP1 POP DUP1 PUSH2 0x216A JUMPI POP POP PUSH2 0xA3C JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT PUSH2 0x2188 JUMPI PUSH2 0x2180 DUP2 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE PUSH2 0x21D0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH2 0x2196 SWAP1 TIMESTAMP PUSH2 0x1C10 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x21AF PUSH1 0x1 SLOAD DUP4 PUSH2 0x1CCE SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x21BB DUP4 DUP3 PUSH2 0x1C6D JUMP JUMPDEST SWAP3 POP PUSH2 0x21CA DUP4 PUSH3 0x69780 PUSH2 0x1D27 JUMP JUMPDEST PUSH1 0x1 SSTORE POP POP JUMPDEST PUSH1 0x4 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH2 0x21E8 SWAP1 PUSH3 0x69780 PUSH2 0x1C6D JUMP JUMPDEST PUSH1 0x0 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xDE88A922E0D3B88B24E9623EFEB464919C6BF9F66857A65E2BFCF2CE87A9433D SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2232 JUMPI DUP2 PUSH2 0x1CC7 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x228E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22EA SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x2019 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x22AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x2019 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2581 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 PUSH2 0x22F9 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x2301 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x2342 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x253A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x234B DUP6 PUSH2 0x245D JUMP JUMPDEST PUSH2 0x239C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x23DB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x23BC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x243D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2442 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x2452 DUP3 DUP3 DUP7 PUSH2 0x2463 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x2472 JUMPI POP DUP2 PUSH2 0x1CC7 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x2482 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x24CC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x24B4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x24F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xA3C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2535 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2521 JUMP JUMPDEST POP SWAP1 JUMP INVALID COINBASE PUSH5 0x6472657373 GASPRICE KECCAK256 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C53616665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F77536166654552433230 GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x756363656564A2646970667358221220798EF9AD DUP12 PUSH5 0xEA9BC6E803 SWAP1 DUP6 SWAP5 CALL PUSH18 0xCA7F8B85C093681D96E336A8FD3FD6F56473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "30571:13398:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34979:267;;;;;;;;;;;;;;;;-1:-1:-1;34979:267:0;-1:-1:-1;;;;;34979:267:0;;:::i;:::-;;;;;;;;;;;;;;;;33942:137;;;:::i;:::-;;31516:42;;;;;;;;;;;;;;;;-1:-1:-1;31516:42:0;-1:-1:-1;;;;;31516:42:0;;:::i;30823:38::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30823:38:0;;;;;;;;;;;;;;30773:41;;;:::i;33103:91::-;;;:::i;32428:454::-;;;;;;;;;;;;;;;;-1:-1:-1;32428:454:0;-1:-1:-1;;;;;32428:454:0;;:::i;37663:97::-;;;;;;;;;;;;;;;;-1:-1:-1;37663:97:0;;;;:::i;31232:24::-;;;:::i;36183:782::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36183:782:0;;;;;;;;:::i;36973:682::-;;;;;;;;;;;;;;;;-1:-1:-1;36973:682:0;;;;;;;;;:::i;30868:41::-;;;:::i;38450:74::-;;;:::i;31567:29::-;;;;;;;;;;;;;;;;-1:-1:-1;31567:29:0;;:::i;31263:37::-;;;:::i;33473:122::-;;;;;;;;;;;;;;;;-1:-1:-1;33473:122:0;-1:-1:-1;;;;;33473:122:0;;:::i;32946:149::-;;;:::i;33718:218::-;;;;;;;;;;;;;;;;-1:-1:-1;33718:218:0;-1:-1:-1;;;;;33718:218:0;;:::i;33350:115::-;;;;;;;;;;;;;;;;-1:-1:-1;33350:115:0;-1:-1:-1;;;;;33350:115:0;;:::i;37768:674::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37768:674:0;;;;;;;;;;:::i;33202:140::-;;;;;;;;;;;;;;;;-1:-1:-1;33202:140:0;-1:-1:-1;;;;;33202:140:0;;:::i;30730:36::-;;;:::i;31043:29::-;;;:::i;34425:135::-;;;:::i;31452:57::-;;;;;;;;;;;;;;;;-1:-1:-1;31452:57:0;-1:-1:-1;;;;;31452:57:0;;:::i;36051:124::-;;;:::i;31157:33::-;;;:::i;30964:32::-;;;:::i;35254:789::-;;;;;;;;;;;;;;;;-1:-1:-1;35254:789:0;;:::i;31307:26::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;31079:29;;;:::i;34568:403::-;;;:::i;33603:107::-;;;:::i;43125:841::-;;;;;;;;;;;;;;;;-1:-1:-1;43125:841:0;;;-1:-1:-1;;;;;43125:841:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31115:35;;;:::i;30916:41::-;;;:::i;40868:2249::-;;;;;;;;;;;;;;;;-1:-1:-1;40868:2249:0;;;-1:-1:-1;;;;;40868:2249:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;31005:31::-;;;:::i;30688:35::-;;;:::i;34979:267::-;-1:-1:-1;;;;;35221:16:0;;35033:7;35221:16;;;:7;:16;;;;;;;;;35153:22;:31;;;;;;35069:169;;35221:16;35069:137;;35201:4;;35069:117;;35132:53;;:16;:14;:16::i;:::-;:20;;:53::i;:::-;-1:-1:-1;;;;;35092:24:0;;;;;;:15;:24;;;;;;;;;35069:9;:18;;;;;;;:48;;:22;:48::i;:::-;:62;;:117::i;:::-;:131;;:137::i;:::-;:151;;:169::i;:::-;35053:185;34979:267;-1:-1:-1;;34979:267:0:o;33942:137::-;33998:10;-1:-1:-1;;;;;34012:13:0;33998:27;;33990:51;;;;;-1:-1:-1;;;33990:51:0;;;;;;;;;;;;-1:-1:-1;;;33990:51:0;;;;;;;;;;;;;;;34052:19;34059:12;;34052:19;:::i;:::-;33942:137::o;31516:42::-;;;;;;;;;;;;;:::o;30823:38::-;;;:::o;30773:41::-;30808:6;30773:41;:::o;33103:91::-;33174:12;;33103:91;;:::o;32428:454::-;32490:6;;;;32489:7;32481:31;;;;;-1:-1:-1;;;32481:31:0;;;;;;;;;;;;-1:-1:-1;;;32481:31:0;;;;;;;;;;;;;;;32523:6;:13;;-1:-1:-1;;32523:13:0;32532:4;32523:13;;;32565:32;;;-1:-1:-1;;;32565:32:0;;32586:10;32565:32;;;;;;32523:6;;-1:-1:-1;;;;;32565:20:0;;;;;:32;;;;;;;;;;;;;;;:20;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32565:32:0;;-1:-1:-1;32616:12:0;32608:46;;;;;-1:-1:-1;;;32608:46:0;;;;;;;;;;;;-1:-1:-1;;;32608:46:0;;;;;;;;;;;;;;;32665:63;-1:-1:-1;;;;;32665:27:0;;32693:10;32713:4;32720:7;32665:27;:63::i;:::-;32739:10;-1:-1:-1;;;;;32739:18:0;;32758:16;32776:7;32739:45;;;;;;;;;;;;;-1:-1:-1;;;;;32739:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32795:55:0;;;-1:-1:-1;;;32795:55:0;;32833:7;32795:55;;;;;;;;;;;;-1:-1:-1;;;;;32807:16:0;32795:37;;;;:55;;;;;-1:-1:-1;;32795:55:0;;;;;;;-1:-1:-1;32795:37:0;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32861:13;:11;:13::i;:::-;32428:454;;:::o;37663:97::-;37734:10;37724:21;;;;:9;:21;;;;;;37715:37;;37746:5;37715:8;:37::i;:::-;37663:97;:::o;31232:24::-;;;;:::o;36183:782::-;36262:4;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;36302:1:::1;36292:7;:11;36284:51;;;::::0;;-1:-1:-1;;;36284:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36414:14;:12;:14::i;:::-;36498:12;:19:::0;36481:14:::1;36528:103;36546:6;36542:1;:10;36528:103;;;36582:12;36595:1;36582:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;36573:46:::1;::::0;;-1:-1:-1;;;36573:46:0;;-1:-1:-1;;;;;36573:46:0;;::::1;;::::0;::::1;::::0;;;;;;;;;36582:15;;;::::1;::::0;36573:31:::1;::::0;:46;;;;;;;;;;;36582:15;;36573:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36554:3:0::1;::::0;;::::1;::::0;-1:-1:-1;36528:103:0::1;::::0;-1:-1:-1;36528:103:0::1;;-1:-1:-1::0;36680:12:0::1;::::0;:25:::1;::::0;36697:7;36680:16:::1;:25::i;:::-;36665:12;:40:::0;-1:-1:-1;;;;;36773:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:28:::1;::::0;36793:7;36773:19:::1;:28::i;:::-;-1:-1:-1::0;;;;;36755:15:0;;::::1;;::::0;;;:9:::1;:15;::::0;;;;:46;;;;36847:65:::1;::::0;:12:::1;:29;36877:10;36897:4;36904:7:::0;36847:29:::1;:65::i;:::-;36930:27;::::0;;;;;;;36937:10:::1;::::0;36930:27:::1;::::0;;;;;::::1;::::0;;::::1;34408:1;36183:782:::0;;;:::o;36973:682::-;37050:10;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;37096:1:::1;37086:7;:11;37078:54;;;::::0;;-1:-1:-1;;;37078:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37207:12;:19:::0;37190:14:::1;37237:112;37255:6;37251:1;:10;37237:112;;;37291:12;37304:1;37291:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;37282:55:::1;::::0;;-1:-1:-1;;;37282:55:0;;37317:10:::1;37282:55;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;37291:15:0;;::::1;::::0;37282:34:::1;::::0;:55;;;;;;;;;;37291:15;;37282:55;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37263:3:0::1;::::0;;::::1;::::0;-1:-1:-1;37237:112:0::1;::::0;-1:-1:-1;37237:112:0::1;;-1:-1:-1::0;37376:12:0::1;::::0;:25:::1;::::0;37393:7;37376:16:::1;:25::i;:::-;37361:12;:40:::0;37446:10:::1;37436:21;::::0;;;:9:::1;:21;::::0;;;;;:34:::1;::::0;37462:7;37436:25:::1;:34::i;:::-;37422:10;37412:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;37481:46:::1;::::0;:12:::1;-1:-1:-1::0;;;;;37481:25:0::1;::::0;37519:7;37481:25:::1;:46::i;:::-;37543:30;::::0;;;;;;;37553:10:::1;::::0;37543:30:::1;::::0;;;;;::::1;::::0;;::::1;37589:5;37586:62;;;37610:26;37620:10;37631:4;37610:9;:26::i;:::-;34408:1;36973:682:::0;;;:::o;30868:41::-;;;:::o;38450:74::-;38490:26;38500:10;38511:4;38490:9;:26::i;31567:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31567:29:0;;-1:-1:-1;31567:29:0;:::o;31263:37::-;;;;:::o;33473:122::-;-1:-1:-1;;;;;33563:24:0;33536:7;33563:24;;;:15;:24;;;;;;;33473:122::o;32946:149::-;32997:59;;;-1:-1:-1;;;32997:59:0;;33033:7;32997:59;;;;33050:4;32997:59;;;;;;-1:-1:-1;;;;;33009:16:0;32997:35;;;;:59;;;;;-1:-1:-1;;32997:59:0;;;;;;;-1:-1:-1;32997:35:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33067:20;:18;:20::i;33718:218::-;33787:10;-1:-1:-1;;;;;33801:13:0;33787:27;;33779:51;;;;;-1:-1:-1;;;33779:51:0;;;;;;;;;;;;-1:-1:-1;;;33779:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33849:21:0;;33841:48;;;;;-1:-1:-1;;;33841:48:0;;;;;;;;;;;;-1:-1:-1;;;33841:48:0;;;;;;;;;;;;;;;33902:12;:26;;;;;;;-1:-1:-1;33902:26:0;;;;;;;;-1:-1:-1;;;;;;33902:26:0;-1:-1:-1;;;;;33902:26:0;;;;;;;;;;33718:218::o;33350:115::-;-1:-1:-1;;;;;33439:18:0;33412:7;33439:18;;;:9;:18;;;;;;;33350:115::o;37768:674::-;37844:8;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;37866:14:::1;37883:16;37890:8;37883:6;:16::i;:::-;37866:33:::0;-1:-1:-1;37914:10:0;;37910:169:::1;;-1:-1:-1::0;;;;;37941:17:0;;::::1;37961:1;37941:17:::0;;;:7:::1;:17;::::0;;;;:21;37977:42:::1;::::0;:11:::1;:24;37949:8:::0;38012:6;37977:24:::1;:42::i;:::-;38039:28;::::0;;;;;;;-1:-1:-1;;;;;38039:28:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;37910:169;38142:12;38139:203;;;38187:12;:19:::0;38170:14:::1;38221:110;38239:6;38235:1;:10;38221:110;;;38279:12;38292:1;38279:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;38270:45:::1;::::0;;-1:-1:-1;;;38270:45:0;;-1:-1:-1;;;;;38270:45:0;;::::1;;::::0;::::1;::::0;;;38279:15;;;::::1;::::0;38270:35:::1;::::0;:45;;;;;;;;;;;38279:15;;38270:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38247:3:0::1;::::0;;::::1;::::0;-1:-1:-1;38221:110:0::1;::::0;-1:-1:-1;38221:110:0::1;;;38139:203;;38420:14;:12;:14::i;33202:140::-:0;-1:-1:-1;;;;;33309:24:0;;33259:7;33309:24;;;:15;:24;;;;;;;;;33286:9;:18;;;;;;:48;;:22;:48::i;30730:36::-;;;:::o;31043:29::-;;;;:::o;34425:135::-;34482:7;34509:43;34522:15;34539:12;;34509;:43::i;:::-;34502:50;;34425:135;:::o;31452:57::-;;;;;;;;;;;;;:::o;36051:124::-;36090:15;36108:12;-1:-1:-1;;;;;36108:22:0;;36131:10;36108:34;;;;;;;;;;;;;-1:-1:-1;;;;;36108:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36108:34:0;;-1:-1:-1;36153:14:0;36108:34;36153:5;:14::i;31157:33::-;;;;:::o;30964:32::-;;;:::o;35254:789::-;35316:10;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;35362:1:::1;35352:7;:11;35344:51;;;::::0;;-1:-1:-1;;;35344:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35474:14;:12;:14::i;:::-;35558:12;:19:::0;35541:14:::1;35588:109;35606:6;35602:1;:10;35588:109;;;35642:12;35655:1;35642:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;35633:52:::1;::::0;;-1:-1:-1;;;35633:52:0;;35665:10:::1;35633:52;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;35642:15:0;;::::1;::::0;35633:31:::1;::::0;:52;;;;;;;;;;35642:15;;35633:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35614:3:0::1;::::0;;::::1;::::0;-1:-1:-1;35588:109:0::1;::::0;-1:-1:-1;35588:109:0::1;;-1:-1:-1::0;35746:12:0::1;::::0;:25:::1;::::0;35763:7;35746:16:::1;:25::i;:::-;35731:12;:40:::0;35855:10:::1;35845:21;::::0;;;:9:::1;:21;::::0;;;;;:34:::1;::::0;35871:7;35845:25:::1;:34::i;:::-;35831:10;35821:21;::::0;;;:9:::1;:21;::::0;;;;:58;;;;35925:65:::1;::::0;:12:::1;-1:-1:-1::0;;;;;35925:29:0::1;::::0;35975:4:::1;35982:7:::0;35925:29:::1;:65::i;:::-;36008:27;::::0;;;;;;;36015:10:::1;::::0;36008:27:::1;::::0;;;;;::::1;::::0;;::::1;34408:1;35254:789:::0;;:::o;31307:26::-;;;;;;:::o;31079:29::-;;;;:::o;34568:403::-;34615:7;34635:14;34652:13;:11;:13::i;:::-;34635:30;-1:-1:-1;34680:11:0;34676:71;;-1:-1:-1;;34715:20:0;;34708:27;;34676:71;34773:190;34812:140;34945:6;34812:114;34921:4;34812:90;34891:10;;34812:60;34857:14;;34812:26;:24;:26::i;:140::-;34773:20;;;:24;:190::i;:::-;34757:206;;;34568:403;:::o;33603:107::-;33683:12;:19;33603:107;:::o;43125:841::-;43383:12;:19;43283:15;;;;;43494:1;:8;;43481:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43481:22:0;;43450:53;;43532:11;43514:12;43527:1;43514:15;;;;;;;;;;;;;:29;-1:-1:-1;;;;;43514:29:0;;;-1:-1:-1;;;;;43514:29:0;;;;;43558:6;43554:124;43572:6;43568:1;:10;43554:124;;;43635:12;43648:1;43635:15;;;;;;;;;;;;;;;;;;;43626:39;;;-1:-1:-1;;;43626:39:0;;;;-1:-1:-1;;;;;43635:15:0;;;;43626:37;;:39;;;;;;;;;;43635:15;43626:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43626:39:0;43599:17;;:12;;43612:1;:3;;;43599:17;;;;;;-1:-1:-1;;;;;43599:67:0;;;:17;;;;;;;;;;;:67;43580:3;;43554:124;;;;43688:30;43737:6;43735:1;:8;43721:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43721:23:0;;43688:56;;43774:12;43781:4;43774:6;:12::i;:::-;43755:13;43769:1;43755:16;;;;;;;;;;;;;:31;;;;;43801:6;43797:116;43815:6;43811:1;:10;43797:116;;;43872:12;43885:1;43872:15;;;;;;;;;;;;;;;;;;;43863:38;;;-1:-1:-1;;;43863:38:0;;-1:-1:-1;;;;;43863:38:0;;;;;;;;;43872:15;;;;;43863:32;;:38;;;;;;;;;;;43872:15;43863:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43863:38:0;43842:18;;:13;;43856:1;:3;;;43842:18;;;;;;;;;;;;;;;:59;43823:3;;43797:116;;;-1:-1:-1;43931:12:0;;;;-1:-1:-1;43125:841:0;-1:-1:-1;;;;;43125:841:0:o;31115:35::-;;;;:::o;30916:41::-;;;:::o;40868:2249::-;41079:4;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;41109:10:::1;-1:-1:-1::0;;;;;41123:16:0::1;41109:30;;41101:39;;;::::0;::::1;;41551:9;::::0;41575:15;41571:200:::1;;41657:12;-1:-1:-1::0;;;;;41615:54:0::1;41629:10;-1:-1:-1::0;;;;;41615:33:0::1;;41649:3;41615:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41615:38:0;-1:-1:-1;;;;;41615:54:0::1;;41607:63;;;::::0;::::1;;41685:9;:15:::0;;;41571:200:::1;;;41748:10;41741:3;:17;41733:26;;;::::0;::::1;;41787:16:::0;;41783:310:::1;;42061:20;42071:4;42076;42061:9;:20::i;:::-;-1:-1:-1::0;;;;;42127:21:0;::::1;42105:19;42127:21:::0;;;:15:::1;:21;::::0;;;;;42163:25;;::::1;42159:951;;;42290:14;42307:28;:11:::0;42323;42307:15:::1;:28::i;:::-;42367:12;:19:::0;42290:45;;-1:-1:-1;42350:14:0::1;42401:110;42419:6;42415:1;:10;42401:110;;;42459:12;42472:1;42459:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;42450:45:::1;::::0;;-1:-1:-1;;;42450:45:0;;-1:-1:-1;;;;;42450:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;42459:15;;;::::1;::::0;42450:31:::1;::::0;:45;;;;;;;;;;;42459:15;;42450:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42427:3:0::1;::::0;;::::1;::::0;-1:-1:-1;42401:110:0::1;::::0;-1:-1:-1;42401:110:0::1;;-1:-1:-1::0;42540:12:0::1;::::0;:24:::1;::::0;42557:6;42540:16:::1;:24::i;:::-;42525:12;:39:::0;-1:-1:-1;;;;;;;42579:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;:35;;;42159:951:::1;;;42652:11;42638;:25;42634:476;;;42765:14;42782:28;:11:::0;42798;42782:15:::1;:28::i;:::-;42842:12;:19:::0;42765:45;;-1:-1:-1;42825:14:0::1;42876:119;42894:6;42890:1;:10;42876:119;;;42934:12;42947:1;42934:15;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;42925:54:::1;::::0;;-1:-1:-1;;;42925:54:0;;42960:10:::1;42925:54;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;42934:15:0;;::::1;::::0;42925:34:::1;::::0;:54;;;;;;;;;;42934:15;;42925:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42902:3:0::1;::::0;;::::1;::::0;-1:-1:-1;42876:119:0::1;::::0;-1:-1:-1;42876:119:0::1;;-1:-1:-1::0;43024:12:0::1;::::0;:24:::1;::::0;43041:6;43024:16:::1;:24::i;:::-;43009:12;:39:::0;-1:-1:-1;;;;;;;43063:21:0;::::1;;::::0;;;:15:::1;:21;::::0;;;;:35;;;42634:476:::1;34408:1;;40868:2249:::0;;;;;;:::o;31005:31::-;;;;:::o;30688:35::-;;;:::o;12315:158::-;12373:7;12406:1;12401;:6;;12393:49;;;;;-1:-1:-1;;;12393:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12460:5:0;;;12315:158::o;11853:179::-;11911:7;11943:5;;;11967:6;;;;11959:46;;;;;-1:-1:-1;;;11959:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12023:1;11853:179;-1:-1:-1;;;11853:179:0:o;12732:220::-;12790:7;12814:6;12810:20;;-1:-1:-1;12829:1:0;12822:8;;12810:20;12853:5;;;12857:1;12853;:5;:1;12877:5;;;;;:10;12869:56;;;;-1:-1:-1;;;12869:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13430:153;13488:7;13520:1;13516;:5;13508:44;;;;;-1:-1:-1;;;13508:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13574:1;13570;:5;;;;;;;13430:153;-1:-1:-1;;;13430:153:0:o;25405:205::-;25533:68;;;-1:-1:-1;;;;;25533:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25533:68:0;-1:-1:-1;;;25533:68:0;;;25506:96;;25526:5;;25506:19;:96::i;39030:641::-;39083:1;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;39097:14:::1;39114:11;-1:-1:-1::0;;;;;39114:21:0::1;;39144:4;39114:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;39114:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39114:36:0;39186:12:::1;::::0;39114:36;;-1:-1:-1;39167:15:0::1;:31;39163:334;;39228:20;:6:::0;30808::::1;39228:10;:20::i;:::-;39215:10;:33:::0;39163:334:::1;;;39281:17;39301:12:::0;;:33:::1;::::0;39318:15:::1;39301:16;:33::i;:::-;39281:53;;39349:16;39368:25;39382:10;;39368:9;:13;;:25;;;;:::i;:::-;39349:44:::0;-1:-1:-1;39417:20:0::1;:6:::0;39349:44;39417:10:::1;:20::i;:::-;39408:29:::0;-1:-1:-1;39465:20:0::1;39408:29:::0;30808:6:::1;39465:10;:20::i;:::-;39452:10;:33:::0;-1:-1:-1;;39163:334:0::1;39507:14;:23:::0;;;39558:15:::1;39541:14;:32:::0;;;39599:29:::1;::::0;30808:6:::1;39599:19;:29::i;:::-;39584:12;:44:::0;39644:19:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;34408:1;39030:641:::0;:::o;38532:252::-;38675:1;38660:12;;:16;:63;;;;-1:-1:-1;38699:12:0;;:24;;38716:6;38699:16;:24::i;:::-;38680:15;:43;;38660:63;38656:121;;;38742:23;:21;:23::i;25220:177::-;25330:58;;;-1:-1:-1;;;;;25330:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25330:58:0;-1:-1:-1;;;25330:58:0;;;25303:86;;25323:5;;25303:19;:86::i;:::-;25220:177;;;:::o;39679:1181::-;39749:1;34160:16;:14;:16::i;:::-;34137:20;:39;34204:26;:24;:26::i;:::-;34187:14;:43;-1:-1:-1;;;;;34245:21:0;;;34241:157;;34302:15;34309:7;34302:6;:15::i;:::-;-1:-1:-1;;;;;34283:16:0;;;;;;:7;:16;;;;;;;;:34;;;;34366:20;;34332:22;:31;;;;;;:54;34241:157;39773:6:::1;::::0;::::1;;39769:157;;39908:7;;39769:157;40140:62;::::0;;-1:-1:-1;;;40140:62:0;;40179:7:::1;40140:62;::::0;::::1;::::0;40196:4:::1;40140:62:::0;;;;;;40118:18:::1;::::0;-1:-1:-1;;;;;40152:16:0::1;40140:38;::::0;::::1;::::0;:62;;;;;;;;;;;:38;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40140:62:0::1;;::::0;40245:18:::1;::::0;40140:62;;-1:-1:-1;40213:14:0::1;::::0;40230:34:::1;::::0;40140:62;;40230:14:::1;:34::i;:::-;40275:18;:31:::0;;;40213:51;-1:-1:-1;40320:11:0;40317:23:::1;;40333:7;;;;40317:23;40375:12;;40356:15;:31;40352:334;;40417:20;:6:::0;30808::::1;40417:10;:20::i;:::-;40404:10;:33:::0;40352:334:::1;;;40470:17;40490:12:::0;;:33:::1;::::0;40507:15:::1;40490:16;:33::i;:::-;40470:53;;40538:16;40557:25;40571:10;;40557:9;:13;;:25;;;;:::i;:::-;40538:44:::0;-1:-1:-1;40606:20:0::1;:6:::0;40538:44;40606:10:::1;:20::i;:::-;40597:29:::0;-1:-1:-1;40654:20:0::1;40597:29:::0;30808:6:::1;40654:10;:20::i;:::-;40641:10;:33:::0;-1:-1:-1;;40352:334:0::1;40696:14;:23:::0;;;40747:15:::1;40730:14;:32:::0;;;40788:29:::1;::::0;30808:6:::1;40788:19;:29::i;:::-;40773:12;:44:::0;40833:19:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;34408:1;;39679:1181:::0;:::o;231:106::-;289:7;320:1;316;:5;:13;;328:1;316:13;;;-1:-1:-1;324:1:0;;309:20;-1:-1:-1;231:106:0:o;27525:761::-;27949:23;27975:69;28003:4;27975:69;;;;;;;;;;;;;;;;;27983:5;-1:-1:-1;;;;;27975:27:0;;;:69;;;;;:::i;:::-;28059:17;;27949:95;;-1:-1:-1;28059:21:0;28055:224;;28201:10;28190:30;;;;;;;;;;;;;;;-1:-1:-1;28190:30:0;28182:85;;;;-1:-1:-1;;;28182:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20223:195;20326:12;20358:52;20380:6;20388:4;20394:1;20397:12;20358:21;:52::i;:::-;20351:59;20223:195;-1:-1:-1;;;;20223:195:0:o;21275:530::-;21402:12;21460:5;21435:21;:30;;21427:81;;;;-1:-1:-1;;;21427:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21527:18;21538:6;21527:10;:18::i;:::-;21519:60;;;;;-1:-1:-1;;;21519:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21653:12;21667:23;21694:6;-1:-1:-1;;;;;21694:11:0;21714:5;21722:4;21694:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21694:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21652:75;;;;21745:52;21763:7;21772:10;21784:12;21745:17;:52::i;:::-;21738:59;21275:530;-1:-1:-1;;;;;;;21275:530:0:o;17303:422::-;17670:20;17709:8;;;17303:422::o;23815:742::-;23930:12;23959:7;23955:595;;;-1:-1:-1;23990:10:0;23983:17;;23955:595;24104:17;;:21;24100:439;;24367:10;24361:17;24428:15;24415:10;24411:2;24407:19;24400:44;24315:148;24510:12;24503:20;;-1:-1:-1;;;24503:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1939200",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "addExtraReward(address)": "infinite",
                "balanceOf(address)": "2185",
                "chefPid()": "infinite",
                "clearExtraRewards()": "infinite",
                "convexMasterChef()": "infinite",
                "currentRewards()": "1087",
                "duration()": "244",
                "earned(address)": "infinite",
                "extraRewards(uint256)": "2104",
                "extraRewardsLength()": "1109",
                "getReward()": "infinite",
                "getReward(address,bool)": "infinite",
                "harvestFromMasterChef()": "infinite",
                "init(address)": "infinite",
                "isInit()": "1055",
                "lastTimeRewardApplicable()": "1218",
                "lastUpdateTime()": "1065",
                "localBalanceOf(address)": "1275",
                "onTattooReward(uint256,address,address,uint256,uint256)": "infinite",
                "pendingTokens(uint256,address,uint256)": "infinite",
                "periodFinish()": "1108",
                "previousRewardDebt()": "1043",
                "rewardManager()": "infinite",
                "rewardPerToken()": "infinite",
                "rewardPerTokenStored()": "1042",
                "rewardRate()": "1110",
                "rewardToken()": "infinite",
                "rewards(address)": "1215",
                "stake(uint256)": "infinite",
                "stakeAll()": "infinite",
                "stakeFor(address,uint256)": "infinite",
                "stakingToken()": "infinite",
                "tattooBalanceOf(address)": "1209",
                "tattooMasterChef()": "infinite",
                "tattooPid()": "1132",
                "totalSupply()": "1067",
                "userRewardPerTokenPaid(address)": "1169",
                "withdraw(uint256,bool)": "infinite",
                "withdrawAll(bool)": "infinite"
              },
              "internal": {
                "checkHarvest()": "infinite",
                "initRewards()": "infinite",
                "notifyRewardAmount()": "infinite"
              }
            },
            "methodIdentifiers": {
              "addExtraReward(address)": "5e43c47b",
              "balanceOf(address)": "70a08231",
              "chefPid()": "91817d74",
              "clearExtraRewards()": "0569d388",
              "convexMasterChef()": "e0d68925",
              "currentRewards()": "901a7d53",
              "duration()": "0fb5a6b4",
              "earned(address)": "008cc262",
              "extraRewards(uint256)": "40c35446",
              "extraRewardsLength()": "d55a23f4",
              "getReward()": "3d18b912",
              "getReward(address,bool)": "7050ccd9",
              "harvestFromMasterChef()": "4f70b15a",
              "init(address)": "19ab453c",
              "isInit()": "b145a5b8",
              "lastTimeRewardApplicable()": "80faa57d",
              "lastUpdateTime()": "c8f33c91",
              "localBalanceOf(address)": "6762805c",
              "onTattooReward(uint256,address,address,uint256,uint256)": "e24c7613",
              "pendingTokens(uint256,address,uint256)": "d63b3c49",
              "periodFinish()": "ebe2b12b",
              "previousRewardDebt()": "46c65276",
              "rewardManager()": "0f4ef8a6",
              "rewardPerToken()": "cd3daf9d",
              "rewardPerTokenStored()": "df136d65",
              "rewardRate()": "7b0a47ee",
              "rewardToken()": "f7c618c1",
              "rewards(address)": "0700037d",
              "stake(uint256)": "a694fc3a",
              "stakeAll()": "8dcb4061",
              "stakeFor(address,uint256)": "2ee40908",
              "stakingToken()": "72f702f3",
              "tattooBalanceOf(address)": "473be90e",
              "tattooMasterChef()": "395596dd",
              "tattooPid()": "2ae63c5b",
              "totalSupply()": "18160ddd",
              "userRewardPerTokenPaid(address)": "8b876347",
              "withdraw(uint256,bool)": "38d07436",
              "withdrawAll(bool)": "1c1c6fe5"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakingToken_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewardToken_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rewardManager_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tattooMasterChef_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"convexMasterChef_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"chefPid_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"RewardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"RewardPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_reward\",\"type\":\"address\"}],\"name\":\"addExtraReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chefPid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearExtraRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"convexMasterChef\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"duration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"extraRewards\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"extraRewardsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_claimExtras\",\"type\":\"bool\"}],\"name\":\"getReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"harvestFromMasterChef\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"dummyToken\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastTimeRewardApplicable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdateTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"localBalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tattooAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLpAmount\",\"type\":\"uint256\"}],\"name\":\"onTattooReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tattooAmount\",\"type\":\"uint256\"}],\"name\":\"pendingTokens\",\"outputs\":[{\"internalType\":\"contract IERC20[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodFinish\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"previousRewardDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPerTokenStored\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_for\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"stakeFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"tattooBalanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tattooMasterChef\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tattooPid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRewardPerTokenPaid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"claim\",\"type\":\"bool\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"claim\",\"type\":\"bool\"}],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ConvexRewarder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1681,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "periodFinish",
                "offset": 0,
                "slot": "0",
                "type": "t_uint256"
              },
              {
                "astId": 1684,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "rewardRate",
                "offset": 0,
                "slot": "1",
                "type": "t_uint256"
              },
              {
                "astId": 1686,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "lastUpdateTime",
                "offset": 0,
                "slot": "2",
                "type": "t_uint256"
              },
              {
                "astId": 1688,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "rewardPerTokenStored",
                "offset": 0,
                "slot": "3",
                "type": "t_uint256"
              },
              {
                "astId": 1691,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "currentRewards",
                "offset": 0,
                "slot": "4",
                "type": "t_uint256"
              },
              {
                "astId": 1693,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "5",
                "type": "t_uint256"
              },
              {
                "astId": 1695,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "tattooPid",
                "offset": 0,
                "slot": "6",
                "type": "t_uint256"
              },
              {
                "astId": 1698,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "previousRewardDebt",
                "offset": 0,
                "slot": "7",
                "type": "t_uint256"
              },
              {
                "astId": 1701,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "isInit",
                "offset": 0,
                "slot": "8",
                "type": "t_bool"
              },
              {
                "astId": 1705,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "_balances",
                "offset": 0,
                "slot": "9",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1709,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "_tattooBalances",
                "offset": 0,
                "slot": "10",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1713,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "userRewardPerTokenPaid",
                "offset": 0,
                "slot": "11",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1717,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "rewards",
                "offset": 0,
                "slot": "12",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1720,
                "contract": "contracts/ConvexRewarder.sol:ConvexRewarder",
                "label": "extraRewards",
                "offset": 0,
                "slot": "13",
                "type": "t_array(t_address)dyn_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_address)dyn_storage": {
                "base": "t_address",
                "encoding": "dynamic_array",
                "label": "address[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IConvexChef": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "_account",
                  "type": "address"
                }
              ],
              "name": "claim",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_pid",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "_account",
                  "type": "address"
                }
              ],
              "name": "userInfo",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "claim(uint256,address)": "ddd5e1b2",
              "deposit(uint256,uint256)": "e2bbb158",
              "userInfo(uint256,address)": "93f1a40b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"userInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IConvexChef\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ICrvDeposit": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "lockIncentive",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "deposit(uint256,bool)": "9a408321",
              "lockIncentive()": "50940618"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lockIncentive\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ICrvDeposit\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ICurveGauge": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claim_rewards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "reward_tokens",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewarded_token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "balanceOf(address)": "70a08231",
              "claim_rewards()": "e6f1daf2",
              "deposit(uint256)": "b6b55f25",
              "reward_tokens(uint256)": "54c49fe9",
              "rewarded_token()": "16fa50b1",
              "withdraw(uint256)": "2e1a7d4d"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim_rewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"reward_tokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewarded_token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ICurveGauge\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ICurveVoteEscrow": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "create_lock",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "increase_amount",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "increase_unlock_time",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "smart_wallet_checker",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "create_lock(uint256,uint256)": "65fc3873",
              "increase_amount(uint256)": "4957677c",
              "increase_unlock_time(uint256)": "eff7a612",
              "smart_wallet_checker()": "7175d4f7",
              "withdraw()": "3ccfd60b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"create_lock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"increase_amount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"increase_unlock_time\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"smart_wallet_checker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ICurveVoteEscrow\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IDeposit": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "claimRewards",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isShutdown",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "poolInfo",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardArbitrator",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "rewardClaimed",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_pid",
                  "type": "uint256"
                }
              ],
              "name": "setGaugeRedirect",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "withdrawTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "balanceOf(address)": "70a08231",
              "claimRewards(uint256,address)": "6c7b69cb",
              "isShutdown()": "bf86d690",
              "poolInfo(uint256)": "1526fe27",
              "rewardArbitrator()": "043b684a",
              "rewardClaimed(uint256,address,uint256)": "71192b17",
              "setGaugeRedirect(uint256)": "9123d404",
              "totalSupply()": "18160ddd",
              "withdrawTo(uint256,uint256,address)": "14cd70e4"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimRewards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isShutdown\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardArbitrator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewardClaimed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"setGaugeRedirect\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IDeposit\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IERC20": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Interface of the ERC20 standard as defined in the EIP.",
            "events": {
              "Approval(address,address,uint256)": {
                "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."
              },
              "Transfer(address,address,uint256)": {
                "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."
              }
            },
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the amount of tokens owned by `account`."
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IFeeDistro": {
          "abi": [
            {
              "inputs": [],
              "name": "claim",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "claim()": "4e71d92d",
              "token()": "fc0c546a"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IFeeDistro\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IMasterChefV2": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "i",
                  "type": "uint256"
                }
              ],
              "name": "lpToken",
              "outputs": [
                {
                  "internalType": "contract IERC20",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "lpToken(uint256)": "78ed5d1f"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"i\",\"type\":\"uint256\"}],\"name\":\"lpToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Submitted for verification at Etherscan.io on 2020-07-17\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IMasterChefV2\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "Submitted for verification at Etherscan.io on 2020-07-17",
            "version": 1
          }
        },
        "IMinter": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "mint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "mint(address)": "6a627842"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IMinter\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IPools": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_lptoken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_gauge",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_stashVersion",
                  "type": "uint256"
                }
              ],
              "name": "addPool",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "gaugeMap",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "poolInfo",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "poolLength",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_poolM",
                  "type": "address"
                }
              ],
              "name": "setPoolManager",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_pid",
                  "type": "uint256"
                }
              ],
              "name": "shutdownPool",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "addPool(address,address,uint256)": "7e29d6c2",
              "gaugeMap(address)": "cb0d5b52",
              "poolInfo(uint256)": "1526fe27",
              "poolLength()": "081e3eda",
              "setPoolManager(address)": "7aef6715",
              "shutdownPool(uint256)": "60cafe84"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_lptoken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stashVersion\",\"type\":\"uint256\"}],\"name\":\"addPool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"gaugeMap\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_poolM\",\"type\":\"address\"}],\"name\":\"setPoolManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"shutdownPool\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IPools\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IRegistry": {
          "abi": [
            {
              "inputs": [],
              "name": "gauge_controller",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_id",
                  "type": "uint256"
                }
              ],
              "name": "get_address",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "get_gauges",
              "outputs": [
                {
                  "internalType": "address[10]",
                  "name": "",
                  "type": "address[10]"
                },
                {
                  "internalType": "uint128[10]",
                  "name": "",
                  "type": "uint128[10]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "get_lp_token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "get_registry",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "gauge_controller()": "d8b9a018",
              "get_address(uint256)": "493f4f74",
              "get_gauges(address)": "56059ffb",
              "get_lp_token(address)": "37951049",
              "get_registry()": "a262904b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"gauge_controller\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"get_address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"get_gauges\",\"outputs\":[{\"internalType\":\"address[10]\",\"name\":\"\",\"type\":\"address[10]\"},{\"internalType\":\"uint128[10]\",\"name\":\"\",\"type\":\"uint128[10]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"get_lp_token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"get_registry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IRegistry\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IRewardFactory": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "CreateCrvRewards",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "CreateTokenRewards",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "activeRewardCount",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "addActiveReward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "removeActiveReward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "name": "setAccess",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "CreateCrvRewards(uint256,address)": "58cbfd45",
              "CreateTokenRewards(address,address,address)": "f8d6122e",
              "activeRewardCount(address)": "0d5843f7",
              "addActiveReward(address,uint256)": "b7f927b1",
              "removeActiveReward(address,uint256)": "ef9126ad",
              "setAccess(address,bool)": "b84614a5"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"CreateCrvRewards\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"CreateTokenRewards\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"activeRewardCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"addActiveReward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"removeActiveReward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"setAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IRewardFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IRewards": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "addExtraReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "earned",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "exit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "getReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "notifyRewardAmount",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "queueNewRewards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rewardToken",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "stake",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "stakeFor",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "stakingToken",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "addExtraReward(address)": "5e43c47b",
              "earned(address)": "008cc262",
              "exit(address)": "b42652e9",
              "getReward(address)": "c00007b0",
              "notifyRewardAmount(uint256)": "3c6b16ab",
              "queueNewRewards(uint256)": "590a41f5",
              "rewardToken()": "f7c618c1",
              "stake(address,uint256)": "adc9772e",
              "stakeFor(address,uint256)": "2ee40908",
              "stakingToken()": "72f702f3",
              "withdraw(address,uint256)": "f3fef3a3"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"addExtraReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"earned\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"exit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"getReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"notifyRewardAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"queueNewRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakeFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IRewards\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IStaker": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balanceOfPool",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "claimCrv",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "claimFees",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "claimRewards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "createLock",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_value",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "execute",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                },
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "increaseAmount",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "increaseTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "operator",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "release",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "name": "setStashAccess",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "name": "vote",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "voteGaugeWeight",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "withdraw",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "withdrawAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "balanceOfPool(address)": "b0f63794",
              "claimCrv(address)": "3fe9bc06",
              "claimFees(address,address)": "2dbfa735",
              "claimRewards(address)": "ef5cfb8c",
              "createLock(uint256,uint256)": "b52c05fe",
              "deposit(address,address)": "f9609f08",
              "execute(address,uint256,bytes)": "b61d27f6",
              "increaseAmount(uint256)": "15456eba",
              "increaseTime(uint256)": "3c9a2a1a",
              "operator()": "570ca735",
              "release()": "86d1a69f",
              "setStashAccess(address,bool)": "fa3964b2",
              "vote(uint256,address,bool)": "e2cdd42a",
              "voteGaugeWeight(address,uint256)": "5d7e9bcb",
              "withdraw(address)": "51cff8d9",
              "withdraw(address,address,uint256)": "d9caed12",
              "withdrawAll(address,address)": "09cae2c8"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOfPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimCrv\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"createLock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"increaseAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"increaseTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"release\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"setStashAccess\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"voteGaugeWeight\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"withdrawAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IStaker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IStash": {
          "abi": [
            {
              "inputs": [],
              "name": "claimRewards",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "processStash",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "stashRewards",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "claimRewards()": "372500ab",
              "processStash()": "ca8b0176",
              "stashRewards()": "b87bd481"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"claimRewards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"processStash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stashRewards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IStash\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IStashFactory": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "CreateStash",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "CreateStash(uint256,address,address,uint256)": "99cb12de"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CreateStash\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IStashFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ITattooRewarder": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tattooAmount",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "newLpAmount",
                  "type": "uint256"
                }
              ],
              "name": "onTattooReward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "pid",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tattooAmount",
                  "type": "uint256"
                }
              ],
              "name": "pendingTokens",
              "outputs": [
                {
                  "internalType": "contract IERC20[]",
                  "name": "",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onTattooReward(uint256,address,address,uint256,uint256)": "e24c7613",
              "pendingTokens(uint256,address,uint256)": "d63b3c49"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tattooAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLpAmount\",\"type\":\"uint256\"}],\"name\":\"onTattooReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tattooAmount\",\"type\":\"uint256\"}],\"name\":\"pendingTokens\",\"outputs\":[{\"internalType\":\"contract IERC20[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ITattooRewarder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ITokenFactory": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "CreateDepositToken",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "CreateDepositToken(address)": "114a899c"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"CreateDepositToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ITokenFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ITokenMinter": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "burn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "burn(address,uint256)": "9dc29fac",
              "mint(address,uint256)": "40c10f19"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ITokenMinter\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IVestedEscrow": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address[]",
                  "name": "_recipient",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256[]",
                  "name": "_amount",
                  "type": "uint256[]"
                }
              ],
              "name": "fund",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "fund(address[],uint256[])": "b1e56f6b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_recipient\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_amount\",\"type\":\"uint256[]\"}],\"name\":\"fund\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IVestedEscrow\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IVoting": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "getVote",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                },
                {
                  "internalType": "uint64",
                  "name": "",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "",
                  "type": "uint64"
                },
                {
                  "internalType": "uint64",
                  "name": "",
                  "type": "uint64"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "",
                  "type": "bytes"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                },
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "name": "vote",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "name": "vote_for_gauge_weights",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "getVote(uint256)": "5a55c1f0",
              "vote(uint256,bool,bool)": "df133bca",
              "vote_for_gauge_weights(address,uint256)": "d7136328"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"getVote\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"vote_for_gauge_weights\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IVoting\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "IWalletChecker": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "check",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "check(address)": "c23697a8"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"check\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"IWalletChecker\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "MathUtil": {
          "abi": [],
          "devdoc": {
            "details": "Standard math utilities missing in the Solidity language.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203e8a6e664c843a0e245eab0df37c7c0f739c891f0f41959fd648dd6e184d15f064736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RETURNDATACOPY DUP11 PUSH15 0x664C843A0E245EAB0DF37C7C0F739C DUP10 0x1F 0xF COINBASE SWAP6 SWAP16 0xD6 0x48 0xDD PUSH15 0x184D15F064736F6C634300060C0033 ",
              "sourceMap": "139:201:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203e8a6e664c843a0e245eab0df37c7c0f739c891f0f41959fd648dd6e184d15f064736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 RETURNDATACOPY DUP11 PUSH15 0x664C843A0E245EAB0DF37C7C0F739C DUP10 0x1F 0xF COINBASE SWAP6 SWAP16 0xD6 0x48 0xDD PUSH15 0x184D15F064736F6C634300060C0033 ",
              "sourceMap": "139:201:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "min(uint256,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Standard math utilities missing in the Solidity language.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"MathUtil\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "ReentrancyGuard": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"ReentrancyGuard\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 23,
                "contract": "contracts/ConvexRewarder.sol:ReentrancyGuard",
                "label": "_guardCounter",
                "offset": 0,
                "slot": "0",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "SafeERC20": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.",
            "kind": "dev",
            "methods": {},
            "title": "SafeERC20",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206ac926c37622f3f7af2592308958c33c72060f7a154c5a6e5f57ab0a53c8826b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0xC926C37622F3F7AF259230 DUP10 PC 0xC3 EXTCODECOPY PUSH19 0x60F7A154C5A6E5F57AB0A53C8826B64736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "25128:3161:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206ac926c37622f3f7af2592308958c33c72060f7a154c5a6e5f57ab0a53c8826b64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH11 0xC926C37622F3F7AF259230 DUP10 PC 0xC3 EXTCODECOPY PUSH19 0x60F7A154C5A6E5F57AB0A53C8826B64736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "25128:3161:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_callOptionalReturn(contract IERC20,bytes memory)": "infinite",
                "safeApprove(contract IERC20,address,uint256)": "infinite",
                "safeDecreaseAllowance(contract IERC20,address,uint256)": "infinite",
                "safeIncreaseAllowance(contract IERC20,address,uint256)": "infinite",
                "safeTransfer(contract IERC20,address,uint256)": "infinite",
                "safeTransferFrom(contract IERC20,address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SafeERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"SafeERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        },
        "SafeMath": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220969be695218929f0b22dba6489e45126c934fdb2fb4725bfbbe025ec21f06a8c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 SWAP12 0xE6 SWAP6 0x21 DUP10 0x29 CREATE 0xB2 0x2D 0xBA PUSH5 0x89E45126C9 CALLVALUE REVERT 0xB2 0xFB SELFBALANCE 0x25 0xBF 0xBB 0xE0 0x25 0xEC 0x21 CREATE PUSH11 0x8C64736F6C634300060C00 CALLER ",
              "sourceMap": "9726:6790:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220969be695218929f0b22dba6489e45126c934fdb2fb4725bfbbe025ec21f06a8c64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 SWAP12 0xE6 SWAP6 0x21 DUP10 0x29 CREATE 0xB2 0x2D 0xBA PUSH5 0x89E45126C9 CALLVALUE REVERT 0xB2 0xFB SELFBALANCE 0x25 0xBF 0xBB 0xE0 0x25 0xEC 0x21 CREATE PUSH11 0x8C64736F6C634300060C00 CALLER ",
              "sourceMap": "9726:6790:0:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint256,uint256)": "infinite",
                "div(uint256,uint256)": "infinite",
                "div(uint256,uint256,string memory)": "infinite",
                "mod(uint256,uint256)": "infinite",
                "mod(uint256,uint256,string memory)": "infinite",
                "mul(uint256,uint256)": "infinite",
                "sub(uint256,uint256)": "infinite",
                "sub(uint256,uint256,string memory)": "infinite",
                "tryAdd(uint256,uint256)": "infinite",
                "tryDiv(uint256,uint256)": "infinite",
                "tryMod(uint256,uint256)": "infinite",
                "tryMul(uint256,uint256)": "infinite",
                "trySub(uint256,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ConvexRewarder.sol\":\"SafeMath\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/ConvexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n\\r\\n/**\\r\\n * @dev Standard math utilities missing in the Solidity language.\\r\\n */\\r\\nlibrary MathUtil {\\r\\n    /**\\r\\n     * @dev Returns the smallest of two numbers.\\r\\n     */\\r\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        return a < b ? a : b;\\r\\n    }\\r\\n}\\r\\n\\r\\ncontract ReentrancyGuard {\\r\\n    uint256 private _guardCounter;\\r\\n\\r\\n    constructor () internal {\\r\\n        _guardCounter = 1;\\r\\n    }\\r\\n\\r\\n    modifier nonReentrant() {\\r\\n        _guardCounter += 1;\\r\\n        uint256 localCounter = _guardCounter;\\r\\n        _;\\r\\n        require(localCounter == _guardCounter, \\\"ReentrancyGuard: reentrant call\\\");\\r\\n    }\\r\\n}\\r\\n\\r\\ninterface ICurveGauge {\\r\\n    function deposit(uint256) external;\\r\\n    function balanceOf(address) external view returns (uint256);\\r\\n    function withdraw(uint256) external;\\r\\n    function claim_rewards() external;\\r\\n    function reward_tokens(uint256) external view returns(address);//v2\\r\\n    function rewarded_token() external view returns(address);//v1\\r\\n}\\r\\n\\r\\ninterface ICurveVoteEscrow {\\r\\n    function create_lock(uint256, uint256) external;\\r\\n    function increase_amount(uint256) external;\\r\\n    function increase_unlock_time(uint256) external;\\r\\n    function withdraw() external;\\r\\n    function smart_wallet_checker() external view returns (address);\\r\\n}\\r\\n\\r\\ninterface IWalletChecker {\\r\\n    function check(address) external view returns (bool);\\r\\n}\\r\\n\\r\\ninterface IVoting{\\r\\n    function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided\\r\\n    function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);\\r\\n    function vote_for_gauge_weights(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IMinter{\\r\\n    function mint(address) external;\\r\\n}\\r\\n\\r\\ninterface IRegistry{\\r\\n    function get_registry() external view returns(address);\\r\\n    function get_address(uint256 _id) external view returns(address);\\r\\n    function gauge_controller() external view returns(address);\\r\\n    function get_lp_token(address) external view returns(address);\\r\\n    function get_gauges(address) external view returns(address[10] memory,uint128[10] memory);\\r\\n}\\r\\n\\r\\ninterface IStaker{\\r\\n    function deposit(address, address) external;\\r\\n    function withdraw(address) external;\\r\\n    function withdraw(address, address, uint256) external;\\r\\n    function withdrawAll(address, address) external;\\r\\n    function createLock(uint256, uint256) external;\\r\\n    function increaseAmount(uint256) external;\\r\\n    function increaseTime(uint256) external;\\r\\n    function release() external;\\r\\n    function claimCrv(address) external returns (uint256);\\r\\n    function claimRewards(address) external;\\r\\n    function claimFees(address,address) external;\\r\\n    function setStashAccess(address, bool) external;\\r\\n    function vote(uint256,address,bool) external;\\r\\n    function voteGaugeWeight(address,uint256) external;\\r\\n    function balanceOfPool(address) external view returns (uint256);\\r\\n    function operator() external view returns (address);\\r\\n    function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory);\\r\\n}\\r\\n\\r\\ninterface IRewards{\\r\\n    function stake(address, uint256) external;\\r\\n    function stakeFor(address, uint256) external;\\r\\n    function withdraw(address, uint256) external;\\r\\n    function exit(address) external;\\r\\n    function getReward(address) external;\\r\\n    function queueNewRewards(uint256) external;\\r\\n    function notifyRewardAmount(uint256) external;\\r\\n    function addExtraReward(address) external;\\r\\n    function stakingToken() external view returns (address);\\r\\n    function rewardToken() external view returns(address);\\r\\n    function earned(address account) external view returns (uint256);\\r\\n}\\r\\n\\r\\ninterface IStash{\\r\\n    function stashRewards() external returns (bool);\\r\\n    function processStash() external returns (bool);\\r\\n    function claimRewards() external returns (bool);\\r\\n}\\r\\n\\r\\ninterface IFeeDistro{\\r\\n    function claim() external;\\r\\n    function token() external view returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenMinter{\\r\\n    function mint(address,uint256) external;\\r\\n    function burn(address,uint256) external;\\r\\n}\\r\\n\\r\\ninterface IDeposit{\\r\\n    function isShutdown() external view returns(bool);\\r\\n    function balanceOf(address _account) external view returns(uint256);\\r\\n    function totalSupply() external view returns(uint256);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address, bool);\\r\\n    function rewardClaimed(uint256,address,uint256) external;\\r\\n    function withdrawTo(uint256,uint256,address) external;\\r\\n    function claimRewards(uint256,address) external returns(bool);\\r\\n    function rewardArbitrator() external returns(address);\\r\\n    function setGaugeRedirect(uint256 _pid) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface ICrvDeposit{\\r\\n    function deposit(uint256, bool) external;\\r\\n    function lockIncentive() external view returns(uint256);\\r\\n}\\r\\n\\r\\ninterface IRewardFactory{\\r\\n    function setAccess(address,bool) external;\\r\\n    function CreateCrvRewards(uint256,address) external returns(address);\\r\\n    function CreateTokenRewards(address,address,address) external returns(address);\\r\\n    function activeRewardCount(address) external view returns(uint256);\\r\\n    function addActiveReward(address,uint256) external returns(bool);\\r\\n    function removeActiveReward(address,uint256) external returns(bool);\\r\\n}\\r\\n\\r\\ninterface IStashFactory{\\r\\n    function CreateStash(uint256,address,address,uint256) external returns(address);\\r\\n}\\r\\n\\r\\ninterface ITokenFactory{\\r\\n    function CreateDepositToken(address) external returns(address);\\r\\n}\\r\\n\\r\\ninterface IPools{\\r\\n    function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);\\r\\n    function shutdownPool(uint256 _pid) external returns(bool);\\r\\n    function poolInfo(uint256) external view returns(address,address,address,address,address,bool);\\r\\n    function poolLength() external view returns (uint256);\\r\\n    function gaugeMap(address) external view returns(bool);\\r\\n    function setPoolManager(address _poolM) external;\\r\\n}\\r\\n\\r\\ninterface IVestedEscrow{\\r\\n    function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\IERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\r\\n */\\r\\ninterface IERC20 {\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens in existence.\\r\\n     */\\r\\n    function totalSupply() external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the amount of tokens owned by `account`.\\r\\n     */\\r\\n    function balanceOf(address account) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remaining number of tokens that `spender` will be\\r\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\r\\n     * zero by default.\\r\\n     *\\r\\n     * This value changes when {approve} or {transferFrom} are called.\\r\\n     */\\r\\n    function allowance(address owner, address spender) external view returns (uint256);\\r\\n\\r\\n    /**\\r\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\r\\n     * that someone may use both the old and the new allowance by unfortunate\\r\\n     * transaction ordering. One possible solution to mitigate this race\\r\\n     * condition is to first reduce the spender's allowance to 0 and set the\\r\\n     * desired value afterwards:\\r\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\r\\n     *\\r\\n     * Emits an {Approval} event.\\r\\n     */\\r\\n    function approve(address spender, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\r\\n     * allowance mechanism. `amount` is then deducted from the caller's\\r\\n     * allowance.\\r\\n     *\\r\\n     * Returns a boolean value indicating whether the operation succeeded.\\r\\n     *\\r\\n     * Emits a {Transfer} event.\\r\\n     */\\r\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\r\\n     * another (`to`).\\r\\n     *\\r\\n     * Note that `value` may be zero.\\r\\n     */\\r\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n\\r\\n    /**\\r\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\r\\n     * a call to {approve}. `value` is the new allowance.\\r\\n     */\\r\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\math\\\\SafeMath.sol\\r\\n\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\r\\n * checks.\\r\\n *\\r\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\r\\n * in bugs, because programmers usually assume that an overflow raises an\\r\\n * error, which is the standard behavior in high level programming languages.\\r\\n * `SafeMath` restores this intuition by reverting the transaction when an\\r\\n * operation overflows.\\r\\n *\\r\\n * Using this library instead of the unchecked operations eliminates an entire\\r\\n * class of bugs, so it's recommended to use it always.\\r\\n */\\r\\nlibrary SafeMath {\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        uint256 c = a + b;\\r\\n        if (c < a) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b > a) return (false, 0);\\r\\n        return (true, a - b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\r\\n        // benefit is lost if 'b' is also tested.\\r\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\r\\n        if (a == 0) return (true, 0);\\r\\n        uint256 c = a * b;\\r\\n        if (c / a != b) return (false, 0);\\r\\n        return (true, c);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a / b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\r\\n        if (b == 0) return (false, 0);\\r\\n        return (true, a % b);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the addition of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `+` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Addition cannot overflow.\\r\\n     */\\r\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        uint256 c = a + b;\\r\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\r\\n     * overflow.\\r\\n     *\\r\\n     * Counterpart to Solidity's `*` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Multiplication cannot overflow.\\r\\n     */\\r\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        if (a == 0) return 0;\\r\\n        uint256 c = a * b;\\r\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\r\\n        return c;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting when dividing by zero.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\r\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\r\\n        return a % b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\r\\n     * overflow (when the result is negative).\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `-` operator.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - Subtraction cannot overflow.\\r\\n     */\\r\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b <= a, errorMessage);\\r\\n        return a - b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\r\\n     * division by zero. The result is rounded towards zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\r\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\r\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a / b;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\r\\n     * reverting with custom message when dividing by zero.\\r\\n     *\\r\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\r\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\r\\n     *\\r\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\r\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\r\\n     * invalid opcode to revert (consuming all remaining gas).\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - The divisor cannot be zero.\\r\\n     */\\r\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\r\\n        require(b > 0, errorMessage);\\r\\n        return a % b;\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: node_modules\\\\@openzeppelin\\\\contracts\\\\utils\\\\Address.sol\\r\\n\\r\\npragma solidity >=0.6.2 <0.8.0;\\r\\n\\r\\n/**\\r\\n * @dev Collection of functions related to the address type\\r\\n */\\r\\nlibrary Address {\\r\\n    /**\\r\\n     * @dev Returns true if `account` is a contract.\\r\\n     *\\r\\n     * [IMPORTANT]\\r\\n     * ====\\r\\n     * It is unsafe to assume that an address for which this function returns\\r\\n     * false is an externally-owned account (EOA) and not a contract.\\r\\n     *\\r\\n     * Among others, `isContract` will return false for the following\\r\\n     * types of addresses:\\r\\n     *\\r\\n     *  - an externally-owned account\\r\\n     *  - a contract in construction\\r\\n     *  - an address where a contract will be created\\r\\n     *  - an address where a contract lived, but was destroyed\\r\\n     * ====\\r\\n     */\\r\\n    function isContract(address account) internal view returns (bool) {\\r\\n        // This method relies on extcodesize, which returns 0 for contracts in\\r\\n        // construction, since the code is only stored at the end of the\\r\\n        // constructor execution.\\r\\n\\r\\n        uint256 size;\\r\\n        // solhint-disable-next-line no-inline-assembly\\r\\n        assembly { size := extcodesize(account) }\\r\\n        return size > 0;\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\r\\n     * `recipient`, forwarding all available gas and reverting on errors.\\r\\n     *\\r\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\r\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\r\\n     * imposed by `transfer`, making them unable to receive funds via\\r\\n     * `transfer`. {sendValue} removes this limitation.\\r\\n     *\\r\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\r\\n     *\\r\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\r\\n     * taken to not create reentrancy vulnerabilities. Consider using\\r\\n     * {ReentrancyGuard} or the\\r\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\r\\n     */\\r\\n    function sendValue(address payable recipient, uint256 amount) internal {\\r\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\r\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\r\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Performs a Solidity function call using a low level `call`. A\\r\\n     * plain`call` is an unsafe replacement for a function call: use this\\r\\n     * function instead.\\r\\n     *\\r\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\r\\n     * function (like regular Solidity function calls).\\r\\n     *\\r\\n     * Returns the raw returned data. To convert to the expected return value,\\r\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - `target` must be a contract.\\r\\n     * - calling `target` with `data` must not revert.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\r\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, 0, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but also transferring `value` wei to `target`.\\r\\n     *\\r\\n     * Requirements:\\r\\n     *\\r\\n     * - the calling contract must have an ETH balance of at least `value`.\\r\\n     * - the called Solidity function must be `payable`.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\r\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\r\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\r\\n     *\\r\\n     * _Available since v3.1._\\r\\n     */\\r\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\r\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\r\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a static call.\\r\\n     *\\r\\n     * _Available since v3.3._\\r\\n     */\\r\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\r\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\r\\n     * but performing a delegate call.\\r\\n     *\\r\\n     * _Available since v3.4._\\r\\n     */\\r\\n    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\r\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\r\\n\\r\\n        // solhint-disable-next-line avoid-low-level-calls\\r\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\r\\n        return _verifyCallResult(success, returndata, errorMessage);\\r\\n    }\\r\\n\\r\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\r\\n        if (success) {\\r\\n            return returndata;\\r\\n        } else {\\r\\n            // Look for revert reason and bubble it up if present\\r\\n            if (returndata.length > 0) {\\r\\n                // The easiest way to bubble the revert reason is using memory via assembly\\r\\n\\r\\n                // solhint-disable-next-line no-inline-assembly\\r\\n                assembly {\\r\\n                    let returndata_size := mload(returndata)\\r\\n                    revert(add(32, returndata), returndata_size)\\r\\n                }\\r\\n            } else {\\r\\n                revert(errorMessage);\\r\\n            }\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: @openzeppelin\\\\contracts\\\\token\\\\ERC20\\\\SafeERC20.sol\\r\\npragma solidity >=0.6.0 <0.8.0;\\r\\n\\r\\n\\r\\n/**\\r\\n * @title SafeERC20\\r\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\r\\n * contract returns false). Tokens that return no value (and instead revert or\\r\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\r\\n * successful.\\r\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\r\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\r\\n */\\r\\nlibrary SafeERC20 {\\r\\n    using SafeMath for uint256;\\r\\n    using Address for address;\\r\\n\\r\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\r\\n    }\\r\\n\\r\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Deprecated. This function has issues similar to the ones found in\\r\\n     * {IERC20-approve}, and its usage is discouraged.\\r\\n     *\\r\\n     * Whenever possible, use {safeIncreaseAllowance} and\\r\\n     * {safeDecreaseAllowance} instead.\\r\\n     */\\r\\n    function safeApprove(IERC20 token, address spender, uint256 value) internal {\\r\\n        // safeApprove should only be called when setting an initial allowance,\\r\\n        // or when resetting it to zero. To increase and decrease it, use\\r\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\r\\n        // solhint-disable-next-line max-line-length\\r\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\r\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\r\\n        );\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\r\\n    }\\r\\n\\r\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\r\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\r\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\r\\n    }\\r\\n\\r\\n    /**\\r\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\r\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\r\\n     * @param token The token targeted by the call.\\r\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\r\\n     */\\r\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\r\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\r\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\r\\n        // the target address contains contract code and also asserts for success in the low-level call.\\r\\n\\r\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\r\\n        if (returndata.length > 0) { // Return data is optional\\r\\n            // solhint-disable-next-line max-line-length\\r\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\r\\n        }\\r\\n    }\\r\\n}\\r\\n\\r\\n// File: contracts\\\\interfaces\\\\ITattooRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface ITattooRewarder {\\r\\n    using SafeERC20 for IERC20;\\r\\n    function onTattooReward(uint256 pid, address user, address recipient, uint256 tattooAmount, uint256 newLpAmount) external;\\r\\n    function pendingTokens(uint256 pid, address user, uint256 tattooAmount) external view returns (IERC20[] memory, uint256[] memory);\\r\\n}\\r\\n\\r\\n\\r\\n// File: contracts\\\\ConvexRewarder.sol\\r\\n\\r\\npragma solidity 0.6.12;\\r\\n/**\\r\\n *Submitted for verification at Etherscan.io on 2020-07-17\\r\\n */\\r\\n\\r\\n/*\\r\\n   ____            __   __        __   _\\r\\n  / __/__ __ ___  / /_ / /  ___  / /_ (_)__ __\\r\\n _\\\\ \\\\ / // // _ \\\\/ __// _ \\\\/ -_)/ __// / \\\\ \\\\ /\\r\\n/___/ \\\\_, //_//_/\\\\__//_//_/\\\\__/ \\\\__//_/ /_\\\\_\\\\\\r\\n     /___/\\r\\n\\r\\n* Docs: https://docs.synthetix.io/\\r\\n*\\r\\n*\\r\\n* MIT License\\r\\n* ===========\\r\\n*\\r\\n* Copyright (c) 2020 Synthetix\\r\\n*\\r\\n* Permission is hereby granted, free of charge, to any person obtaining a copy\\r\\n* of this software and associated documentation files (the \\\"Software\\\"), to deal\\r\\n* in the Software without restriction, including without limitation the rights\\r\\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\r\\n* copies of the Software, and to permit persons to whom the Software is\\r\\n* furnished to do so, subject to the following conditions:\\r\\n*\\r\\n* The above copyright notice and this permission notice shall be included in all\\r\\n* copies or substantial portions of the Software.\\r\\n*\\r\\n* THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\r\\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\r\\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\r\\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\r\\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\r\\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\r\\n*/\\r\\n\\r\\n\\r\\n\\r\\ninterface IMasterChefV2 {\\r\\n    function lpToken(uint i) external view returns (IERC20);\\r\\n}\\r\\n\\r\\ninterface IConvexChef{\\r\\n    function userInfo(uint256 _pid, address _account) external view returns(uint256,uint256);\\r\\n    function claim(uint256 _pid, address _account) external;\\r\\n    function deposit(uint256 _pid, uint256 _amount) external;\\r\\n}\\r\\n\\r\\n\\r\\ncontract ConvexRewarder is ITattooRewarder{\\r\\n    using SafeERC20 for IERC20;\\r\\n    using SafeMath for uint256;\\r\\n\\r\\n    IERC20 public immutable rewardToken;\\r\\n    IERC20 public immutable stakingToken;\\r\\n    uint256 public constant duration = 5 days;\\r\\n\\r\\n    address public immutable rewardManager;\\r\\n    address public immutable tattooMasterChef;\\r\\n    address public immutable convexMasterChef;\\r\\n    uint256 public immutable chefPid;\\r\\n\\r\\n    uint256 public periodFinish = 0;\\r\\n    uint256 public rewardRate = 0;\\r\\n    uint256 public lastUpdateTime;\\r\\n    uint256 public rewardPerTokenStored;\\r\\n    uint256 public currentRewards = 0;\\r\\n    uint256 private _totalSupply;\\r\\n    uint256 public tattooPid;\\r\\n    uint256 public previousRewardDebt = 0;\\r\\n    bool public isInit = false;\\r\\n\\r\\n    mapping(address => uint256) private _balances;\\r\\n    mapping(address => uint256) private _tattooBalances;\\r\\n    mapping(address => uint256) public userRewardPerTokenPaid;\\r\\n    mapping(address => uint256) public rewards;\\r\\n\\r\\n    address[] public extraRewards;\\r\\n\\r\\n    event RewardAdded(uint256 reward);\\r\\n    event Staked(address indexed user, uint256 amount);\\r\\n    event Withdrawn(address indexed user, uint256 amount);\\r\\n    event RewardPaid(address indexed user, uint256 reward);\\r\\n\\r\\n    constructor(\\r\\n        address stakingToken_,\\r\\n        address rewardToken_,\\r\\n        address rewardManager_,\\r\\n        address tattooMasterChef_,\\r\\n        address convexMasterChef_,\\r\\n        uint256 chefPid_\\r\\n    ) public {\\r\\n        stakingToken = IERC20(stakingToken_);\\r\\n        rewardToken = IERC20(rewardToken_);\\r\\n        rewardManager = rewardManager_;\\r\\n        tattooMasterChef = tattooMasterChef_;\\r\\n        convexMasterChef = convexMasterChef_;\\r\\n        chefPid = chefPid_;\\r\\n    }\\r\\n\\r\\n    //stake a dummy token into convex chef to start earning rewards\\r\\n    //initiate a week's worth of awards\\r\\n    function init(IERC20 dummyToken) external {\\r\\n        require(!isInit,\\\"already init\\\");\\r\\n        isInit = true;\\r\\n        uint256 balance = dummyToken.balanceOf(msg.sender);\\r\\n        require(balance != 0, \\\"Balance must exceed 0\\\");\\r\\n        dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\r\\n        dummyToken.approve(convexMasterChef, balance);\\r\\n        IConvexChef(convexMasterChef).deposit(chefPid, balance);\\r\\n        initRewards();\\r\\n    }\\r\\n\\r\\n    //claim from convex master chef and add to rewards\\r\\n    function harvestFromMasterChef() public {\\r\\n        IConvexChef(convexMasterChef).claim(chefPid, address(this));\\r\\n        notifyRewardAmount();\\r\\n    }\\r\\n\\r\\n    function totalSupply() public view returns (uint256) {\\r\\n        return _totalSupply;\\r\\n    }\\r\\n\\r\\n    function balanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account].add(_tattooBalances[account]);\\r\\n    }\\r\\n\\r\\n    function localBalanceOf(address account) public view returns (uint256) {\\r\\n        return _balances[account];\\r\\n    }\\r\\n\\r\\n    function tattooBalanceOf(address account) public view returns (uint256) {\\r\\n        return _tattooBalances[account];\\r\\n    }\\r\\n\\r\\n    function extraRewardsLength() external view returns (uint256) {\\r\\n        return extraRewards.length;\\r\\n    }\\r\\n\\r\\n    function addExtraReward(address _reward) external {\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        require(_reward != address(0),\\\"!reward setting\\\");\\r\\n\\r\\n        extraRewards.push(_reward);\\r\\n    }\\r\\n    function clearExtraRewards() external{\\r\\n        require(msg.sender == rewardManager, \\\"!authorized\\\");\\r\\n        delete extraRewards;\\r\\n    }\\r\\n\\r\\n    modifier updateReward(address account) {\\r\\n        rewardPerTokenStored = rewardPerToken();\\r\\n        lastUpdateTime = lastTimeRewardApplicable();\\r\\n        if (account != address(0)) {\\r\\n            rewards[account] = earned(account);\\r\\n            userRewardPerTokenPaid[account] = rewardPerTokenStored;\\r\\n        }\\r\\n        _;\\r\\n    }\\r\\n\\r\\n    function lastTimeRewardApplicable() public view returns (uint256) {\\r\\n        return MathUtil.min(block.timestamp, periodFinish);\\r\\n    }\\r\\n\\r\\n    function rewardPerToken() public view returns (uint256) {\\r\\n        uint256 supply = totalSupply();\\r\\n        if (supply == 0) {\\r\\n            return rewardPerTokenStored;\\r\\n        }\\r\\n        return\\r\\n        rewardPerTokenStored.add(\\r\\n            lastTimeRewardApplicable()\\r\\n            .sub(lastUpdateTime)\\r\\n            .mul(rewardRate)\\r\\n            .mul(1e18)\\r\\n            .div(supply)\\r\\n        );\\r\\n    }\\r\\n\\r\\n    function earned(address account) public view returns (uint256) {\\r\\n        return\\r\\n        _balances[account].add(_tattooBalances[account])\\r\\n        .mul(rewardPerToken().sub(userRewardPerTokenPaid[account]))\\r\\n        .div(1e18)\\r\\n        .add(rewards[account]);\\r\\n    }\\r\\n\\r\\n    function stake(uint256 _amount)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to sender balance sheet\\r\\n        _balances[msg.sender] = _balances[msg.sender].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function stakeAll() external{\\r\\n        uint256 balance = stakingToken.balanceOf(msg.sender);\\r\\n        stake(balance);\\r\\n    }\\r\\n\\r\\n    function stakeFor(address _for, uint256 _amount)\\r\\n    public\\r\\n    updateReward(_for)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot stake 0');\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n\\r\\n        //also stake to linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).stake(_for, _amount);\\r\\n        }\\r\\n\\r\\n        //add supply\\r\\n        _totalSupply = _totalSupply.add(_amount);\\r\\n        //add to _for's balance sheet\\r\\n        _balances[_for] = _balances[_for].add(_amount);\\r\\n        //take tokens from sender\\r\\n        stakingToken.safeTransferFrom(msg.sender, address(this), _amount);\\r\\n\\r\\n        emit Staked(msg.sender, _amount);\\r\\n    }\\r\\n\\r\\n    function withdraw(uint256 _amount, bool claim)\\r\\n    public\\r\\n    updateReward(msg.sender)\\r\\n    {\\r\\n        require(_amount > 0, 'RewardPool : Cannot withdraw 0');\\r\\n\\r\\n        //also withdraw from linked rewards\\r\\n        uint256 length = extraRewards.length;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            IRewards(extraRewards[i]).withdraw(msg.sender, _amount);\\r\\n        }\\r\\n\\r\\n        _totalSupply = _totalSupply.sub(_amount);\\r\\n        _balances[msg.sender] = _balances[msg.sender].sub(_amount);\\r\\n        stakingToken.safeTransfer(msg.sender, _amount);\\r\\n        emit Withdrawn(msg.sender, _amount);\\r\\n\\r\\n        if(claim){\\r\\n            getReward(msg.sender,true);\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function withdrawAll(bool claim) external{\\r\\n        withdraw(_balances[msg.sender],claim);\\r\\n    }\\r\\n\\r\\n    function getReward(address _account, bool _claimExtras) public updateReward(_account){\\r\\n\\r\\n        uint256 reward = earned(_account);\\r\\n        if (reward > 0) {\\r\\n            rewards[_account] = 0;\\r\\n            rewardToken.safeTransfer(_account, reward);\\r\\n            emit RewardPaid(_account, reward);\\r\\n        }\\r\\n\\r\\n        //also get rewards from linked rewards\\r\\n        if(_claimExtras){\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).getReward(_account);\\r\\n            }\\r\\n        }\\r\\n\\r\\n        //check if new rewards should be pulled from convex chef\\r\\n        checkHarvest();\\r\\n    }\\r\\n\\r\\n    function getReward() external{\\r\\n        getReward(msg.sender,true);\\r\\n    }\\r\\n\\r\\n    function checkHarvest() internal{\\r\\n        //if getting close to the end of the period\\r\\n        //claim and extend\\r\\n        if (periodFinish > 0 && block.timestamp >= periodFinish.sub(1 days)  ) {\\r\\n            harvestFromMasterChef();\\r\\n        }\\r\\n    }\\r\\n\\r\\n    //initialize the period of rewards\\r\\n    //since the reward rate should be same as speed as rewards coming in from the chef\\r\\n    // it will never catch up unless there is a seed\\r\\n    // (or if it mines for a week with 0 distribution)\\r\\n    function initRewards() internal updateReward(address(0)){\\r\\n        uint256 reward = rewardToken.balanceOf(address(this));\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function notifyRewardAmount()\\r\\n    internal\\r\\n    updateReward(address(0))\\r\\n    {\\r\\n        if(!isInit){\\r\\n            //return smoothly if not init yet.\\r\\n            //allow stakers to join but dont start distribution\\r\\n            return;\\r\\n        }\\r\\n        //convex chef allows anyone to claim, so we have to look at reward debt difference\\r\\n        //so that we know how much we have claimed since previous notifyRewardAmount()\\r\\n        (,uint256 rewardDebt) = IConvexChef(convexMasterChef).userInfo(chefPid, address(this));\\r\\n        uint256 reward = rewardDebt.sub(previousRewardDebt);\\r\\n        previousRewardDebt = rewardDebt;\\r\\n        if(reward == 0) return;\\r\\n\\r\\n        if (block.timestamp >= periodFinish) {\\r\\n            rewardRate = reward.div(duration);\\r\\n        } else {\\r\\n            uint256 remaining = periodFinish.sub(block.timestamp);\\r\\n            uint256 leftover = remaining.mul(rewardRate);\\r\\n            reward = reward.add(leftover);\\r\\n            rewardRate = reward.div(duration);\\r\\n        }\\r\\n        currentRewards = reward;\\r\\n        lastUpdateTime = block.timestamp;\\r\\n        periodFinish = block.timestamp.add(duration);\\r\\n        emit RewardAdded(reward);\\r\\n    }\\r\\n\\r\\n    function onTattooReward(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        address recipient,\\r\\n        uint256 tattooAmount,\\r\\n        uint256 newLpAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    updateReward(user)\\r\\n    {\\r\\n        require(msg.sender == tattooMasterChef);\\r\\n\\r\\n        // On the first call, validate that the pid correctly maps to our stakingToken\\r\\n        // Tattoo MasterChef does not allow modifying a pid after it has been set, so we can trust\\r\\n        // this to be safe in the future. If we did not validate the pid going forward, there\\r\\n        // could be an attack vector by setting this contract as rewardContract on a 2nd pid\\r\\n        uint256 _tattooPid = tattooPid;\\r\\n        if (_tattooPid == 0) {\\r\\n            require(IMasterChefV2(msg.sender).lpToken(pid) == stakingToken);\\r\\n            tattooPid = pid;\\r\\n        } else {\\r\\n            require(pid == _tattooPid);\\r\\n        }\\r\\n\\r\\n        if (tattooAmount > 0) {\\r\\n            // if tattooAmount > 0 the call is claiming tattoo and should also claim other rewards\\r\\n\\r\\n            //tattoo allows claiming for user and transferring to recipient, but we do not.\\r\\n            //just claim to original account\\r\\n            getReward(user,true);\\r\\n        }\\r\\n\\r\\n        uint256 userBalance = _tattooBalances[user];\\r\\n        if (newLpAmount > userBalance) {\\r\\n            // reported balance in tattoo > internal accounting, user has deposited\\r\\n            uint256 amount = newLpAmount.sub(userBalance);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).stake(user, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.add(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n\\r\\n        } else if (newLpAmount < userBalance) {\\r\\n            // reported balance in tattoo < internal accounting, user has withdrawn\\r\\n            uint256 amount = userBalance.sub(newLpAmount);\\r\\n            uint256 length = extraRewards.length;\\r\\n            for(uint i=0; i < length; i++){\\r\\n                IRewards(extraRewards[i]).withdraw(msg.sender, amount);\\r\\n            }\\r\\n            _totalSupply = _totalSupply.sub(amount);\\r\\n            _tattooBalances[user] = newLpAmount;\\r\\n        }\\r\\n    }\\r\\n\\r\\n    function pendingTokens(\\r\\n        uint256 pid,\\r\\n        address user,\\r\\n        uint256 tattooAmount\\r\\n    )\\r\\n    override\\r\\n    external\\r\\n    view\\r\\n    returns (IERC20[] memory, uint256[] memory)\\r\\n    {\\r\\n        //extra rewards length\\r\\n        uint256 length = extraRewards.length;\\r\\n\\r\\n        //combine base and extras\\r\\n        IERC20[] memory rewardTokens = new IERC20[](1+length);\\r\\n        rewardTokens[0] = rewardToken;\\r\\n        for(uint i=0; i < length; i++){\\r\\n            rewardTokens[1+i] = IERC20(IRewards(extraRewards[i]).rewardToken());\\r\\n        }\\r\\n        uint256[] memory earnedAmounts = new uint256[](1+length);\\r\\n        earnedAmounts[0] = earned(user);\\r\\n        for(uint i=0; i < length; i++){\\r\\n            earnedAmounts[1+i] = IRewards(extraRewards[i]).earned(user);\\r\\n        }\\r\\n        return (rewardTokens,earnedAmounts);\\r\\n    }\\r\\n}\",\"keccak256\":\"0xb8e541487d8b09feb05be8966f0ee39103ed7ec76a17bb10ddaaa0e0bc676add\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      }
    },
    "errors": [
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/ConvexRewarder.sol:1092:9: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n        address recipient,\n        ^---------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 40964,
          "file": "contracts/ConvexRewarder.sol",
          "start": 40947
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/ConvexRewarder.sol:1146:9: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n        uint256 pid,\n        ^---------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 43169,
          "file": "contracts/ConvexRewarder.sol",
          "start": 43158
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/ConvexRewarder.sol:1148:9: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n        uint256 tattooAmount\n        ^------------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 43223,
          "file": "contracts/ConvexRewarder.sol",
          "start": 43203
        },
        "type": "Warning"
      }
    ],
    "sources": {
      "contracts/ConvexRewarder.sol": {
        "ast": {
          "absolutePath": "contracts/ConvexRewarder.sol",
          "exportedSymbols": {
            "Address": [
              1377
            ],
            "ConvexRewarder": [
              2972
            ],
            "IConvexChef": [
              1655
            ],
            "ICrvDeposit": [
              511
            ],
            "ICurveGauge": [
              84
            ],
            "ICurveVoteEscrow": [
              110
            ],
            "IDeposit": [
              498
            ],
            "IERC20": [
              728
            ],
            "IFeeDistro": [
              409
            ],
            "IMasterChefV2": [
              1629
            ],
            "IMinter": [
              166
            ],
            "IPools": [
              639
            ],
            "IRegistry": [
              204
            ],
            "IRewardFactory": [
              564
            ],
            "IRewards": [
              384
            ],
            "IStaker": [
              320
            ],
            "IStash": [
              400
            ],
            "IStashFactory": [
              578
            ],
            "ITattooRewarder": [
              1619
            ],
            "ITokenFactory": [
              586
            ],
            "ITokenMinter": [
              424
            ],
            "IVestedEscrow": [
              651
            ],
            "IVoting": [
              160
            ],
            "IWalletChecker": [
              118
            ],
            "MathUtil": [
              21
            ],
            "ReentrancyGuard": [
              51
            ],
            "SafeERC20": [
              1586
            ],
            "SafeMath": [
              1082
            ]
          },
          "id": 2973,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:23:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 2,
                "nodeType": "StructuredDocumentation",
                "src": "62:75:0",
                "text": " @dev Standard math utilities missing in the Solidity language."
              },
              "fullyImplemented": true,
              "id": 21,
              "linearizedBaseContracts": [
                21
              ],
              "name": "MathUtil",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 19,
                    "nodeType": "Block",
                    "src": "298:39:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 14,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 12,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5,
                              "src": "316:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 13,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7,
                              "src": "320:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "316:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 16,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7,
                            "src": "328:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 17,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "316:13:0",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 15,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5,
                            "src": "324:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 11,
                        "id": 18,
                        "nodeType": "Return",
                        "src": "309:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3,
                    "nodeType": "StructuredDocumentation",
                    "src": "163:62:0",
                    "text": " @dev Returns the smallest of two numbers."
                  },
                  "id": 20,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "min",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20,
                        "src": "244:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "244:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20,
                        "src": "255:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "255:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "243:22:0"
                  },
                  "returnParameters": {
                    "id": 11,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20,
                        "src": "289:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "289:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "288:9:0"
                  },
                  "scope": 21,
                  "src": "231:106:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 2973,
              "src": "139:201:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 51,
              "linearizedBaseContracts": [
                51
              ],
              "name": "ReentrancyGuard",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 23,
                  "mutability": "mutable",
                  "name": "_guardCounter",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 51,
                  "src": "376:29:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 22,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "376:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 30,
                    "nodeType": "Block",
                    "src": "438:36:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 28,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 26,
                            "name": "_guardCounter",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 23,
                            "src": "449:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "31",
                            "id": 27,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "465:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "449:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 29,
                        "nodeType": "ExpressionStatement",
                        "src": "449:17:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 31,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "426:2:0"
                  },
                  "returnParameters": {
                    "id": 25,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "438:0:0"
                  },
                  "scope": 51,
                  "src": "414:60:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 49,
                    "nodeType": "Block",
                    "src": "506:180:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 35,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 33,
                            "name": "_guardCounter",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 23,
                            "src": "517:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "31",
                            "id": 34,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "534:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "517:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 36,
                        "nodeType": "ExpressionStatement",
                        "src": "517:18:0"
                      },
                      {
                        "assignments": [
                          38
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 38,
                            "mutability": "mutable",
                            "name": "localCounter",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 49,
                            "src": "546:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 37,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "546:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 40,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 39,
                          "name": "_guardCounter",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 23,
                          "src": "569:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "546:36:0"
                      },
                      {
                        "id": 41,
                        "nodeType": "PlaceholderStatement",
                        "src": "593:1:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 45,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 43,
                                "name": "localCounter",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 38,
                                "src": "613:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 44,
                                "name": "_guardCounter",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 23,
                                "src": "629:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "613:29:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5265656e7472616e637947756172643a207265656e7472616e742063616c6c",
                              "id": 46,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "644:33:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619",
                                "typeString": "literal_string \"ReentrancyGuard: reentrant call\""
                              },
                              "value": "ReentrancyGuard: reentrant call"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619",
                                "typeString": "literal_string \"ReentrancyGuard: reentrant call\""
                              }
                            ],
                            "id": 42,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "605:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 47,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "605:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 48,
                        "nodeType": "ExpressionStatement",
                        "src": "605:73:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 50,
                  "name": "nonReentrant",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 32,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "503:2:0"
                  },
                  "src": "482:204:0",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 2973,
              "src": "344:345:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 84,
              "linearizedBaseContracts": [
                84
              ],
              "name": "ICurveGauge",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b6b55f25",
                  "id": 56,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 54,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 53,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 56,
                        "src": "739:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 52,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "739:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "738:9:0"
                  },
                  "returnParameters": {
                    "id": 55,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "756:0:0"
                  },
                  "scope": 84,
                  "src": "722:35:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 63,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 59,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 58,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 63,
                        "src": "782:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 57,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "782:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "781:9:0"
                  },
                  "returnParameters": {
                    "id": 62,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 61,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 63,
                        "src": "814:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 60,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "814:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "813:9:0"
                  },
                  "scope": 84,
                  "src": "763:60:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2e1a7d4d",
                  "id": 68,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 66,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 65,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 68,
                        "src": "847:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 64,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "847:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "846:9:0"
                  },
                  "returnParameters": {
                    "id": 67,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "864:0:0"
                  },
                  "scope": 84,
                  "src": "829:36:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "e6f1daf2",
                  "id": 71,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claim_rewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 69,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "893:2:0"
                  },
                  "returnParameters": {
                    "id": 70,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "904:0:0"
                  },
                  "scope": 84,
                  "src": "871:34:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "54c49fe9",
                  "id": 78,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "reward_tokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 74,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 73,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 78,
                        "src": "934:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 72,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "934:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "933:9:0"
                  },
                  "returnParameters": {
                    "id": 77,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 76,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 78,
                        "src": "965:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 75,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "965:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "964:9:0"
                  },
                  "scope": 84,
                  "src": "911:63:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "16fa50b1",
                  "id": 83,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "rewarded_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 79,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1007:2:0"
                  },
                  "returnParameters": {
                    "id": 82,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 81,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 83,
                        "src": "1032:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 80,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1032:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1031:9:0"
                  },
                  "scope": 84,
                  "src": "984:57:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "693:355:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 110,
              "linearizedBaseContracts": [
                110
              ],
              "name": "ICurveVoteEscrow",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "65fc3873",
                  "id": 91,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create_lock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 89,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 86,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 91,
                        "src": "1107:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 85,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1107:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 88,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 91,
                        "src": "1116:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 87,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1116:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1106:18:0"
                  },
                  "returnParameters": {
                    "id": 90,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1133:0:0"
                  },
                  "scope": 110,
                  "src": "1086:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "4957677c",
                  "id": 96,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increase_amount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 94,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 93,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 96,
                        "src": "1165:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 92,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1165:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1164:9:0"
                  },
                  "returnParameters": {
                    "id": 95,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1182:0:0"
                  },
                  "scope": 110,
                  "src": "1140:43:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "eff7a612",
                  "id": 101,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increase_unlock_time",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 99,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 98,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 101,
                        "src": "1219:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 97,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1219:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1218:9:0"
                  },
                  "returnParameters": {
                    "id": 100,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1236:0:0"
                  },
                  "scope": 110,
                  "src": "1189:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3ccfd60b",
                  "id": 104,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 102,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1260:2:0"
                  },
                  "returnParameters": {
                    "id": 103,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1271:0:0"
                  },
                  "scope": 110,
                  "src": "1243:29:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7175d4f7",
                  "id": 109,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "smart_wallet_checker",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 105,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1307:2:0"
                  },
                  "returnParameters": {
                    "id": 108,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 107,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 109,
                        "src": "1333:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 106,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1333:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1332:9:0"
                  },
                  "scope": 110,
                  "src": "1278:64:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "1052:293:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 118,
              "linearizedBaseContracts": [
                118
              ],
              "name": "IWalletChecker",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "c23697a8",
                  "id": 117,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "check",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 113,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 112,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 117,
                        "src": "1396:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 111,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1396:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1395:9:0"
                  },
                  "returnParameters": {
                    "id": 116,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 115,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 117,
                        "src": "1428:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 114,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1428:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1427:6:0"
                  },
                  "scope": 118,
                  "src": "1381:53:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "1349:88:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 160,
              "linearizedBaseContracts": [
                160
              ],
              "name": "IVoting",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "df133bca",
                  "id": 127,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "vote",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 125,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 120,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 127,
                        "src": "1479:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 119,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1479:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 122,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 127,
                        "src": "1488:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 121,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1488:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 124,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 127,
                        "src": "1494:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 123,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1494:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1478:21:0"
                  },
                  "returnParameters": {
                    "id": 126,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1508:0:0"
                  },
                  "scope": 160,
                  "src": "1465:44:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "5a55c1f0",
                  "id": 152,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getVote",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 130,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 129,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1568:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 128,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1568:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1567:9:0"
                  },
                  "returnParameters": {
                    "id": 151,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 132,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1599:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 131,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1599:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 134,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1604:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 133,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1604:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 136,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1609:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1609:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 138,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1616:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 137,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1616:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 140,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1623:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 139,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1623:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 142,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1630:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 141,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1630:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 144,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1637:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 143,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1637:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 146,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1645:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 145,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1645:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 148,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1653:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 147,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1653:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 150,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 152,
                        "src": "1661:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 149,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "1661:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1598:76:0"
                  },
                  "scope": 160,
                  "src": "1551:124:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d7136328",
                  "id": 159,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "vote_for_gauge_weights",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 157,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 154,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 159,
                        "src": "1713:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 153,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1713:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 156,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 159,
                        "src": "1721:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 155,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1721:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1712:17:0"
                  },
                  "returnParameters": {
                    "id": 158,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1738:0:0"
                  },
                  "scope": 160,
                  "src": "1681:58:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "1441:301:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 166,
              "linearizedBaseContracts": [
                166
              ],
              "name": "IMinter",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "6a627842",
                  "id": 165,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 163,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 162,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 165,
                        "src": "1784:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 161,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1784:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1783:9:0"
                  },
                  "returnParameters": {
                    "id": 164,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1801:0:0"
                  },
                  "scope": 166,
                  "src": "1770:32:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "1746:59:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 204,
              "linearizedBaseContracts": [
                204
              ],
              "name": "IRegistry",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "a262904b",
                  "id": 171,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get_registry",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 167,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1856:2:0"
                  },
                  "returnParameters": {
                    "id": 170,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 169,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 171,
                        "src": "1881:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 168,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1881:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1880:9:0"
                  },
                  "scope": 204,
                  "src": "1835:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "493f4f74",
                  "id": 178,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get_address",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 174,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 173,
                        "mutability": "mutable",
                        "name": "_id",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 178,
                        "src": "1917:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 172,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1917:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1916:13:0"
                  },
                  "returnParameters": {
                    "id": 177,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 176,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 178,
                        "src": "1952:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 175,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1952:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1951:9:0"
                  },
                  "scope": 204,
                  "src": "1896:65:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d8b9a018",
                  "id": 183,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "gauge_controller",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 179,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1992:2:0"
                  },
                  "returnParameters": {
                    "id": 182,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 181,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 183,
                        "src": "2017:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 180,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2017:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2016:9:0"
                  },
                  "scope": 204,
                  "src": "1967:59:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "37951049",
                  "id": 190,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get_lp_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 186,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 185,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 190,
                        "src": "2054:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 184,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2054:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2053:9:0"
                  },
                  "returnParameters": {
                    "id": 189,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 188,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 190,
                        "src": "2085:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 187,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2085:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2084:9:0"
                  },
                  "scope": 204,
                  "src": "2032:62:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "56059ffb",
                  "id": 203,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get_gauges",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 193,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 192,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 203,
                        "src": "2120:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 191,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2120:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2119:9:0"
                  },
                  "returnParameters": {
                    "id": 202,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 197,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 203,
                        "src": "2151:18:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$10_memory_ptr",
                          "typeString": "address[10]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 194,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "2151:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 196,
                          "length": {
                            "argumentTypes": null,
                            "hexValue": "3130",
                            "id": 195,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2159:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_10_by_1",
                              "typeString": "int_const 10"
                            },
                            "value": "10"
                          },
                          "nodeType": "ArrayTypeName",
                          "src": "2151:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$10_storage_ptr",
                            "typeString": "address[10]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 201,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 203,
                        "src": "2170:18:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint128_$10_memory_ptr",
                          "typeString": "uint128[10]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 198,
                            "name": "uint128",
                            "nodeType": "ElementaryTypeName",
                            "src": "2170:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "id": 200,
                          "length": {
                            "argumentTypes": null,
                            "hexValue": "3130",
                            "id": 199,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2178:2:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_10_by_1",
                              "typeString": "int_const 10"
                            },
                            "value": "10"
                          },
                          "nodeType": "ArrayTypeName",
                          "src": "2170:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint128_$10_storage_ptr",
                            "typeString": "uint128[10]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2150:39:0"
                  },
                  "scope": 204,
                  "src": "2100:90:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "1809:384:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 320,
              "linearizedBaseContracts": [
                320
              ],
              "name": "IStaker",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f9609f08",
                  "id": 211,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 209,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 206,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 211,
                        "src": "2238:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 205,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2238:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 208,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 211,
                        "src": "2247:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 207,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2247:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2237:18:0"
                  },
                  "returnParameters": {
                    "id": 210,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2264:0:0"
                  },
                  "scope": 320,
                  "src": "2221:44:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "51cff8d9",
                  "id": 216,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 214,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 213,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 216,
                        "src": "2289:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 212,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2289:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2288:9:0"
                  },
                  "returnParameters": {
                    "id": 215,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2306:0:0"
                  },
                  "scope": 320,
                  "src": "2271:36:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d9caed12",
                  "id": 225,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 223,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 218,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 225,
                        "src": "2331:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 217,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2331:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 220,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 225,
                        "src": "2340:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 219,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2340:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 222,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 225,
                        "src": "2349:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 221,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2349:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2330:27:0"
                  },
                  "returnParameters": {
                    "id": 224,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2366:0:0"
                  },
                  "scope": 320,
                  "src": "2313:54:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "09cae2c8",
                  "id": 232,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 230,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 227,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 232,
                        "src": "2394:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 226,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2394:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 229,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 232,
                        "src": "2403:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 228,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2403:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2393:18:0"
                  },
                  "returnParameters": {
                    "id": 231,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2420:0:0"
                  },
                  "scope": 320,
                  "src": "2373:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b52c05fe",
                  "id": 239,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createLock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 237,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 234,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 239,
                        "src": "2447:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 233,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2447:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 236,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 239,
                        "src": "2456:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 235,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2456:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2446:18:0"
                  },
                  "returnParameters": {
                    "id": 238,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2473:0:0"
                  },
                  "scope": 320,
                  "src": "2427:47:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "15456eba",
                  "id": 244,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increaseAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 242,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 241,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 244,
                        "src": "2504:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 240,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2504:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2503:9:0"
                  },
                  "returnParameters": {
                    "id": 243,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2521:0:0"
                  },
                  "scope": 320,
                  "src": "2480:42:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3c9a2a1a",
                  "id": 249,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increaseTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 247,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 246,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 249,
                        "src": "2550:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 245,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2550:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2549:9:0"
                  },
                  "returnParameters": {
                    "id": 248,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2567:0:0"
                  },
                  "scope": 320,
                  "src": "2528:40:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "86d1a69f",
                  "id": 252,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "release",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 250,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2590:2:0"
                  },
                  "returnParameters": {
                    "id": 251,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2601:0:0"
                  },
                  "scope": 320,
                  "src": "2574:28:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3fe9bc06",
                  "id": 259,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimCrv",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 255,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 254,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "2626:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 253,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2626:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2625:9:0"
                  },
                  "returnParameters": {
                    "id": 258,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 257,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 259,
                        "src": "2653:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 256,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2653:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2652:9:0"
                  },
                  "scope": 320,
                  "src": "2608:54:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "ef5cfb8c",
                  "id": 264,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 262,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 261,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 264,
                        "src": "2690:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 260,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2690:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2689:9:0"
                  },
                  "returnParameters": {
                    "id": 263,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2707:0:0"
                  },
                  "scope": 320,
                  "src": "2668:40:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2dbfa735",
                  "id": 271,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimFees",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 269,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 266,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 271,
                        "src": "2733:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 265,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2733:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 268,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 271,
                        "src": "2741:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 267,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2741:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2732:17:0"
                  },
                  "returnParameters": {
                    "id": 270,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2758:0:0"
                  },
                  "scope": 320,
                  "src": "2714:45:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "fa3964b2",
                  "id": 278,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setStashAccess",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 276,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 273,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 278,
                        "src": "2789:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 272,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2789:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 275,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 278,
                        "src": "2798:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 274,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2798:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2788:15:0"
                  },
                  "returnParameters": {
                    "id": 277,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2812:0:0"
                  },
                  "scope": 320,
                  "src": "2765:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "e2cdd42a",
                  "id": 287,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "vote",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 285,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 280,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 287,
                        "src": "2833:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 279,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2833:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 282,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 287,
                        "src": "2841:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 281,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2841:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 284,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 287,
                        "src": "2849:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 283,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2849:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2832:22:0"
                  },
                  "returnParameters": {
                    "id": 286,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2863:0:0"
                  },
                  "scope": 320,
                  "src": "2819:45:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "5d7e9bcb",
                  "id": 294,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "voteGaugeWeight",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 292,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 289,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 294,
                        "src": "2895:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 288,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2895:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 291,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 294,
                        "src": "2903:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 290,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2903:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2894:17:0"
                  },
                  "returnParameters": {
                    "id": 293,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2920:0:0"
                  },
                  "scope": 320,
                  "src": "2870:51:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b0f63794",
                  "id": 301,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfPool",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 297,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 296,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 301,
                        "src": "2950:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 295,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2950:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2949:9:0"
                  },
                  "returnParameters": {
                    "id": 300,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 299,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 301,
                        "src": "2982:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 298,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2982:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2981:9:0"
                  },
                  "scope": 320,
                  "src": "2927:64:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "570ca735",
                  "id": 306,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "operator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 302,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3014:2:0"
                  },
                  "returnParameters": {
                    "id": 305,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 304,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 306,
                        "src": "3040:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 303,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3040:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3039:9:0"
                  },
                  "scope": 320,
                  "src": "2997:52:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b61d27f6",
                  "id": 319,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "execute",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 313,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 308,
                        "mutability": "mutable",
                        "name": "_to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 319,
                        "src": "3072:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 307,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3072:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 310,
                        "mutability": "mutable",
                        "name": "_value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 319,
                        "src": "3085:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 309,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3085:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 312,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 319,
                        "src": "3101:20:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 311,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3101:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3071:51:0"
                  },
                  "returnParameters": {
                    "id": 318,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 315,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 319,
                        "src": "3141:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 314,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3141:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 317,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 319,
                        "src": "3147:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 316,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3147:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3140:20:0"
                  },
                  "scope": 320,
                  "src": "3055:106:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "2197:967:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 384,
              "linearizedBaseContracts": [
                384
              ],
              "name": "IRewards",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "adc9772e",
                  "id": 327,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stake",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 325,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 322,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 327,
                        "src": "3208:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 321,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3208:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 324,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 327,
                        "src": "3217:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 323,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3217:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3207:18:0"
                  },
                  "returnParameters": {
                    "id": 326,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3234:0:0"
                  },
                  "scope": 384,
                  "src": "3193:42:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "2ee40908",
                  "id": 334,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stakeFor",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 332,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 329,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 334,
                        "src": "3259:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 328,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3259:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 331,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 334,
                        "src": "3268:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 330,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3268:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3258:18:0"
                  },
                  "returnParameters": {
                    "id": 333,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3285:0:0"
                  },
                  "scope": 384,
                  "src": "3241:45:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f3fef3a3",
                  "id": 341,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 339,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 336,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 341,
                        "src": "3310:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 335,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3310:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 338,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 341,
                        "src": "3319:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 337,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3319:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3309:18:0"
                  },
                  "returnParameters": {
                    "id": 340,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3336:0:0"
                  },
                  "scope": 384,
                  "src": "3292:45:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b42652e9",
                  "id": 346,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 344,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 343,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 346,
                        "src": "3357:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 342,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3357:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3356:9:0"
                  },
                  "returnParameters": {
                    "id": 345,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3374:0:0"
                  },
                  "scope": 384,
                  "src": "3343:32:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "c00007b0",
                  "id": 351,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 349,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 348,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 351,
                        "src": "3400:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 347,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3400:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3399:9:0"
                  },
                  "returnParameters": {
                    "id": 350,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3417:0:0"
                  },
                  "scope": 384,
                  "src": "3381:37:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "590a41f5",
                  "id": 356,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "queueNewRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 354,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 353,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 356,
                        "src": "3449:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 352,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3449:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3448:9:0"
                  },
                  "returnParameters": {
                    "id": 355,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3466:0:0"
                  },
                  "scope": 384,
                  "src": "3424:43:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3c6b16ab",
                  "id": 361,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "notifyRewardAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 359,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 358,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 361,
                        "src": "3501:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 357,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3501:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3500:9:0"
                  },
                  "returnParameters": {
                    "id": 360,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3518:0:0"
                  },
                  "scope": 384,
                  "src": "3473:46:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "5e43c47b",
                  "id": 366,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addExtraReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 364,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 363,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 366,
                        "src": "3549:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 362,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3549:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3548:9:0"
                  },
                  "returnParameters": {
                    "id": 365,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3566:0:0"
                  },
                  "scope": 384,
                  "src": "3525:42:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "72f702f3",
                  "id": 371,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stakingToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 367,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3594:2:0"
                  },
                  "returnParameters": {
                    "id": 370,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 369,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 371,
                        "src": "3620:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 368,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3620:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3619:9:0"
                  },
                  "scope": 384,
                  "src": "3573:56:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f7c618c1",
                  "id": 376,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "rewardToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 372,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3655:2:0"
                  },
                  "returnParameters": {
                    "id": 375,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 374,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 376,
                        "src": "3680:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 373,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3680:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3679:9:0"
                  },
                  "scope": 384,
                  "src": "3635:54:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "008cc262",
                  "id": 383,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "earned",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 379,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 378,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 383,
                        "src": "3711:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 377,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3711:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3710:17:0"
                  },
                  "returnParameters": {
                    "id": 382,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 381,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 383,
                        "src": "3751:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 380,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3751:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3750:9:0"
                  },
                  "scope": 384,
                  "src": "3695:65:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "3168:595:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 400,
              "linearizedBaseContracts": [
                400
              ],
              "name": "IStash",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b87bd481",
                  "id": 389,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stashRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 385,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3811:2:0"
                  },
                  "returnParameters": {
                    "id": 388,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 387,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 389,
                        "src": "3832:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 386,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3832:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3831:6:0"
                  },
                  "scope": 400,
                  "src": "3790:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "ca8b0176",
                  "id": 394,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "processStash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 390,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3865:2:0"
                  },
                  "returnParameters": {
                    "id": 393,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 392,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 394,
                        "src": "3886:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 391,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3886:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3885:6:0"
                  },
                  "scope": 400,
                  "src": "3844:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "372500ab",
                  "id": 399,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 395,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3919:2:0"
                  },
                  "returnParameters": {
                    "id": 398,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 397,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 399,
                        "src": "3940:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 396,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3940:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3939:6:0"
                  },
                  "scope": 400,
                  "src": "3898:48:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "3767:182:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 409,
              "linearizedBaseContracts": [
                409
              ],
              "name": "IFeeDistro",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "4e71d92d",
                  "id": 403,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 401,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3994:2:0"
                  },
                  "returnParameters": {
                    "id": 402,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4005:0:0"
                  },
                  "scope": 409,
                  "src": "3980:26:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "fc0c546a",
                  "id": 408,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 404,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4026:2:0"
                  },
                  "returnParameters": {
                    "id": 407,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 406,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 408,
                        "src": "4051:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 405,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4051:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4050:9:0"
                  },
                  "scope": 409,
                  "src": "4012:48:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "3953:110:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 424,
              "linearizedBaseContracts": [
                424
              ],
              "name": "ITokenMinter",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "40c10f19",
                  "id": 416,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 414,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 411,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 416,
                        "src": "4110:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 410,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4110:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 413,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 416,
                        "src": "4118:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 412,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4118:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4109:17:0"
                  },
                  "returnParameters": {
                    "id": 415,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4135:0:0"
                  },
                  "scope": 424,
                  "src": "4096:40:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "9dc29fac",
                  "id": 423,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 421,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 418,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 423,
                        "src": "4156:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 417,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4156:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 420,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 423,
                        "src": "4164:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 419,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4164:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4155:17:0"
                  },
                  "returnParameters": {
                    "id": 422,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4181:0:0"
                  },
                  "scope": 424,
                  "src": "4142:40:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "4067:118:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 498,
              "linearizedBaseContracts": [
                498
              ],
              "name": "IDeposit",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "bf86d690",
                  "id": 429,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isShutdown",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 425,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4233:2:0"
                  },
                  "returnParameters": {
                    "id": 428,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 427,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 429,
                        "src": "4258:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 426,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4258:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4257:6:0"
                  },
                  "scope": 498,
                  "src": "4214:50:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 436,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 432,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 431,
                        "mutability": "mutable",
                        "name": "_account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 436,
                        "src": "4289:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 430,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4289:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4288:18:0"
                  },
                  "returnParameters": {
                    "id": 435,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 434,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 436,
                        "src": "4329:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 433,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4329:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4328:9:0"
                  },
                  "scope": 498,
                  "src": "4270:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 441,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 437,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4364:2:0"
                  },
                  "returnParameters": {
                    "id": 440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 439,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 441,
                        "src": "4389:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 438,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4389:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4388:9:0"
                  },
                  "scope": 498,
                  "src": "4344:54:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "1526fe27",
                  "id": 458,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "poolInfo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 444,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 443,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4422:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 442,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4422:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4421:9:0"
                  },
                  "returnParameters": {
                    "id": 457,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 446,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4453:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 445,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4453:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 448,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4461:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 447,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4461:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 450,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4469:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 449,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4469:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 452,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4477:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 451,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4477:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 454,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4485:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 453,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4485:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 456,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 458,
                        "src": "4494:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 455,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4494:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4452:47:0"
                  },
                  "scope": 498,
                  "src": "4404:96:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "71192b17",
                  "id": 467,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "rewardClaimed",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 465,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 460,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 467,
                        "src": "4529:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 459,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4529:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 462,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 467,
                        "src": "4537:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 461,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4537:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 464,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 467,
                        "src": "4545:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 463,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4545:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4528:25:0"
                  },
                  "returnParameters": {
                    "id": 466,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4562:0:0"
                  },
                  "scope": 498,
                  "src": "4506:57:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "14cd70e4",
                  "id": 476,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 474,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 469,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "4589:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 468,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4589:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 471,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "4597:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 470,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4597:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 473,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 476,
                        "src": "4605:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 472,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4605:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4588:25:0"
                  },
                  "returnParameters": {
                    "id": 475,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4622:0:0"
                  },
                  "scope": 498,
                  "src": "4569:54:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "6c7b69cb",
                  "id": 485,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 481,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 478,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 485,
                        "src": "4651:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 477,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4651:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 480,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 485,
                        "src": "4659:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 479,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4659:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4650:17:0"
                  },
                  "returnParameters": {
                    "id": 484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 483,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 485,
                        "src": "4685:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 482,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4685:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4684:6:0"
                  },
                  "scope": 498,
                  "src": "4629:62:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "043b684a",
                  "id": 490,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "rewardArbitrator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 486,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4722:2:0"
                  },
                  "returnParameters": {
                    "id": 489,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 488,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 490,
                        "src": "4742:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 487,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4742:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4741:9:0"
                  },
                  "scope": 498,
                  "src": "4697:54:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "9123d404",
                  "id": 497,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setGaugeRedirect",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 493,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 492,
                        "mutability": "mutable",
                        "name": "_pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 497,
                        "src": "4783:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 491,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4783:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4782:14:0"
                  },
                  "returnParameters": {
                    "id": 496,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 495,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 497,
                        "src": "4814:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 494,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4814:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4813:6:0"
                  },
                  "scope": 498,
                  "src": "4757:63:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "4189:634:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 511,
              "linearizedBaseContracts": [
                511
              ],
              "name": "ICrvDeposit",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "9a408321",
                  "id": 505,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 503,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 500,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 505,
                        "src": "4872:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 499,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4872:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 502,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 505,
                        "src": "4881:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 501,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4881:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4871:15:0"
                  },
                  "returnParameters": {
                    "id": 504,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4895:0:0"
                  },
                  "scope": 511,
                  "src": "4855:41:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "50940618",
                  "id": 510,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "lockIncentive",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 506,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4924:2:0"
                  },
                  "returnParameters": {
                    "id": 509,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 508,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 510,
                        "src": "4949:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 507,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4949:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4948:9:0"
                  },
                  "scope": 511,
                  "src": "4902:56:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "4827:134:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 564,
              "linearizedBaseContracts": [
                564
              ],
              "name": "IRewardFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b84614a5",
                  "id": 518,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setAccess",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 516,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 513,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 518,
                        "src": "5015:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 512,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5015:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 515,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 518,
                        "src": "5023:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 514,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5023:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5014:14:0"
                  },
                  "returnParameters": {
                    "id": 517,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5037:0:0"
                  },
                  "scope": 564,
                  "src": "4996:42:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "58cbfd45",
                  "id": 527,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "CreateCrvRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 523,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 520,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "5070:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 519,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5070:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 522,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "5078:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 521,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5078:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5069:17:0"
                  },
                  "returnParameters": {
                    "id": 526,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 525,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 527,
                        "src": "5104:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 524,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5104:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5103:9:0"
                  },
                  "scope": 564,
                  "src": "5044:69:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f8d6122e",
                  "id": 538,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "CreateTokenRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 534,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 529,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 538,
                        "src": "5147:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 528,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5147:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 531,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 538,
                        "src": "5155:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 530,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5155:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 533,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 538,
                        "src": "5163:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 532,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5163:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5146:25:0"
                  },
                  "returnParameters": {
                    "id": 537,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 536,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 538,
                        "src": "5189:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 535,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5189:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5188:9:0"
                  },
                  "scope": 564,
                  "src": "5119:79:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "0d5843f7",
                  "id": 545,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "activeRewardCount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 541,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 540,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 545,
                        "src": "5231:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 539,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5231:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5230:9:0"
                  },
                  "returnParameters": {
                    "id": 544,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 543,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 545,
                        "src": "5262:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 542,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5262:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5261:9:0"
                  },
                  "scope": 564,
                  "src": "5204:67:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b7f927b1",
                  "id": 554,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addActiveReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 550,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 547,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 554,
                        "src": "5302:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 546,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5302:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 549,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 554,
                        "src": "5310:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 548,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5310:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5301:17:0"
                  },
                  "returnParameters": {
                    "id": 553,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 552,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 554,
                        "src": "5336:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 551,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5336:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5335:6:0"
                  },
                  "scope": 564,
                  "src": "5277:65:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "ef9126ad",
                  "id": 563,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "removeActiveReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 559,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 556,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 563,
                        "src": "5376:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 555,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5376:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 558,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 563,
                        "src": "5384:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 557,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5384:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5375:17:0"
                  },
                  "returnParameters": {
                    "id": 562,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 561,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 563,
                        "src": "5410:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 560,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5410:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5409:6:0"
                  },
                  "scope": 564,
                  "src": "5348:68:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "4965:454:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 578,
              "linearizedBaseContracts": [
                578
              ],
              "name": "IStashFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "99cb12de",
                  "id": 577,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "CreateStash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 573,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 566,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 577,
                        "src": "5474:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 565,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5474:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 568,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 577,
                        "src": "5482:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 567,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5482:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 570,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 577,
                        "src": "5490:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 569,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5490:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 572,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 577,
                        "src": "5498:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 571,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5498:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5473:33:0"
                  },
                  "returnParameters": {
                    "id": 576,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 575,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 577,
                        "src": "5524:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 574,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5524:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5523:9:0"
                  },
                  "scope": 578,
                  "src": "5453:80:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "5423:113:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 586,
              "linearizedBaseContracts": [
                586
              ],
              "name": "ITokenFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "114a899c",
                  "id": 585,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "CreateDepositToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 581,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 580,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 585,
                        "src": "5598:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 579,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5598:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5597:9:0"
                  },
                  "returnParameters": {
                    "id": 584,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 583,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 585,
                        "src": "5624:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 582,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5624:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5623:9:0"
                  },
                  "scope": 586,
                  "src": "5570:63:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "5540:96:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 639,
              "linearizedBaseContracts": [
                639
              ],
              "name": "IPools",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7e29d6c2",
                  "id": 597,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addPool",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 593,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 588,
                        "mutability": "mutable",
                        "name": "_lptoken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 597,
                        "src": "5680:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 587,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5680:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 590,
                        "mutability": "mutable",
                        "name": "_gauge",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 597,
                        "src": "5698:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 589,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5698:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 592,
                        "mutability": "mutable",
                        "name": "_stashVersion",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 597,
                        "src": "5714:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 591,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5714:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5679:57:0"
                  },
                  "returnParameters": {
                    "id": 596,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 595,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 597,
                        "src": "5754:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 594,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5754:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5753:6:0"
                  },
                  "scope": 639,
                  "src": "5663:97:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "60cafe84",
                  "id": 604,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "shutdownPool",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 600,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 599,
                        "mutability": "mutable",
                        "name": "_pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 604,
                        "src": "5788:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 598,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5788:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5787:14:0"
                  },
                  "returnParameters": {
                    "id": 603,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 602,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 604,
                        "src": "5819:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 601,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5819:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5818:6:0"
                  },
                  "scope": 639,
                  "src": "5766:59:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "1526fe27",
                  "id": 621,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "poolInfo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 607,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 606,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5849:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 605,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5849:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5848:9:0"
                  },
                  "returnParameters": {
                    "id": 620,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 609,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5880:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 608,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5880:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 611,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5888:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 610,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5888:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 613,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5896:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 612,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5896:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 615,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5904:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 614,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5904:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 617,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5912:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 616,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5912:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 619,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 621,
                        "src": "5920:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 618,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5920:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5879:46:0"
                  },
                  "scope": 639,
                  "src": "5831:95:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "081e3eda",
                  "id": 626,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "poolLength",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 622,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5951:2:0"
                  },
                  "returnParameters": {
                    "id": 625,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 624,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 626,
                        "src": "5977:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 623,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5977:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5976:9:0"
                  },
                  "scope": 639,
                  "src": "5932:54:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "cb0d5b52",
                  "id": 633,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "gaugeMap",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 629,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 628,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 633,
                        "src": "6010:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 627,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6010:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6009:9:0"
                  },
                  "returnParameters": {
                    "id": 632,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 631,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 633,
                        "src": "6041:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 630,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6041:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6040:6:0"
                  },
                  "scope": 639,
                  "src": "5992:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "7aef6715",
                  "id": 638,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setPoolManager",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 636,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 635,
                        "mutability": "mutable",
                        "name": "_poolM",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 638,
                        "src": "6077:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 634,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6077:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6076:16:0"
                  },
                  "returnParameters": {
                    "id": 637,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6101:0:0"
                  },
                  "scope": 639,
                  "src": "6053:49:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "5640:465:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 651,
              "linearizedBaseContracts": [
                651
              ],
              "name": "IVestedEscrow",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b1e56f6b",
                  "id": 650,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "fund",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 646,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 642,
                        "mutability": "mutable",
                        "name": "_recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 650,
                        "src": "6153:29:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 640,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6153:7:0",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 641,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "6153:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 645,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 650,
                        "src": "6184:26:0",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 643,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "6184:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 644,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "6184:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6152:59:0"
                  },
                  "returnParameters": {
                    "id": 649,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 648,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 650,
                        "src": "6229:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 647,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6229:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6228:6:0"
                  },
                  "scope": 651,
                  "src": "6139:96:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "6109:129:0"
            },
            {
              "id": 652,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "6299:31:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 653,
                "nodeType": "StructuredDocumentation",
                "src": "6334:72:0",
                "text": " @dev Interface of the ERC20 standard as defined in the EIP."
              },
              "fullyImplemented": false,
              "id": 728,
              "linearizedBaseContracts": [
                728
              ],
              "name": "IERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 654,
                    "nodeType": "StructuredDocumentation",
                    "src": "6432:68:0",
                    "text": " @dev Returns the amount of tokens in existence."
                  },
                  "functionSelector": "18160ddd",
                  "id": 659,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 655,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6526:2:0"
                  },
                  "returnParameters": {
                    "id": 658,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 657,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 659,
                        "src": "6552:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 656,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6552:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6551:9:0"
                  },
                  "scope": 728,
                  "src": "6506:55:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 660,
                    "nodeType": "StructuredDocumentation",
                    "src": "6569:74:0",
                    "text": " @dev Returns the amount of tokens owned by `account`."
                  },
                  "functionSelector": "70a08231",
                  "id": 667,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 663,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 662,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 667,
                        "src": "6668:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 661,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6668:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6667:17:0"
                  },
                  "returnParameters": {
                    "id": 666,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 665,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 667,
                        "src": "6708:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 664,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6708:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6707:9:0"
                  },
                  "scope": 728,
                  "src": "6649:68:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 668,
                    "nodeType": "StructuredDocumentation",
                    "src": "6725:215:0",
                    "text": " @dev Moves `amount` tokens from the caller's account to `recipient`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "a9059cbb",
                  "id": 677,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 673,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 670,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 677,
                        "src": "6964:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 669,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6964:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 672,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 677,
                        "src": "6983:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 671,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6983:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6963:35:0"
                  },
                  "returnParameters": {
                    "id": 676,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 675,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 677,
                        "src": "7017:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 674,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7017:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7016:6:0"
                  },
                  "scope": 728,
                  "src": "6946:77:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 678,
                    "nodeType": "StructuredDocumentation",
                    "src": "7031:270:0",
                    "text": " @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."
                  },
                  "functionSelector": "dd62ed3e",
                  "id": 687,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 683,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 680,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 687,
                        "src": "7326:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 679,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7326:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 682,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 687,
                        "src": "7341:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 681,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7341:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7325:32:0"
                  },
                  "returnParameters": {
                    "id": 686,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 685,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 687,
                        "src": "7381:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 684,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7381:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7380:9:0"
                  },
                  "scope": 728,
                  "src": "7307:83:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 688,
                    "nodeType": "StructuredDocumentation",
                    "src": "7398:655:0",
                    "text": " @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 697,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 693,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 690,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 697,
                        "src": "8076:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 689,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8076:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 692,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 697,
                        "src": "8093:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 691,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8093:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8075:33:0"
                  },
                  "returnParameters": {
                    "id": 696,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 695,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 697,
                        "src": "8127:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 694,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8127:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8126:6:0"
                  },
                  "scope": 728,
                  "src": "8059:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 698,
                    "nodeType": "StructuredDocumentation",
                    "src": "8141:304:0",
                    "text": " @dev Moves `amount` tokens from `sender` to `recipient` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "23b872dd",
                  "id": 709,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 705,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 700,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 709,
                        "src": "8473:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 699,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8473:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 702,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 709,
                        "src": "8489:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 701,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8489:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 704,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 709,
                        "src": "8508:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 703,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8508:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8472:51:0"
                  },
                  "returnParameters": {
                    "id": 708,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 707,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 709,
                        "src": "8542:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 706,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8542:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8541:6:0"
                  },
                  "scope": 728,
                  "src": "8451:97:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 710,
                    "nodeType": "StructuredDocumentation",
                    "src": "8556:163:0",
                    "text": " @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."
                  },
                  "id": 718,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 717,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 712,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 718,
                        "src": "8740:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 711,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8740:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 714,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 718,
                        "src": "8762:18:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 713,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8762:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 716,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 718,
                        "src": "8782:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 715,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8782:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8739:57:0"
                  },
                  "src": "8725:72:0"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 719,
                    "nodeType": "StructuredDocumentation",
                    "src": "8805:151:0",
                    "text": " @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."
                  },
                  "id": 727,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 726,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 721,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 727,
                        "src": "8977:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 720,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8977:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 723,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 727,
                        "src": "9000:23:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 722,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9000:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 725,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 727,
                        "src": "9025:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 724,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9025:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8976:63:0"
                  },
                  "src": "8962:78:0"
                }
              ],
              "scope": 2973,
              "src": "6408:2635:0"
            },
            {
              "id": 729,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "9114:31:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 730,
                "nodeType": "StructuredDocumentation",
                "src": "9149:575:0",
                "text": " @dev Wrappers over Solidity's arithmetic operations with added overflow\n checks.\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 Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always."
              },
              "fullyImplemented": true,
              "id": 1082,
              "linearizedBaseContracts": [
                1082
              ],
              "name": "SafeMath",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 760,
                    "nodeType": "Block",
                    "src": "9967:102:0",
                    "statements": [
                      {
                        "assignments": [
                          743
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 743,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 760,
                            "src": "9978:9:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 742,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9978:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 747,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 746,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 744,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 733,
                            "src": "9990:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 745,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 735,
                            "src": "9994:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "9990:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9978:17:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 750,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 748,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 743,
                            "src": "10010:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 749,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 733,
                            "src": "10014:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10010:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 755,
                        "nodeType": "IfStatement",
                        "src": "10006:28:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 751,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10025:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 752,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10032:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 753,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "10024:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 741,
                          "id": 754,
                          "nodeType": "Return",
                          "src": "10017:17:0"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 756,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10053:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "id": 757,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 743,
                              "src": "10059:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 758,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "10052:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 741,
                        "id": 759,
                        "nodeType": "Return",
                        "src": "10045:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 731,
                    "nodeType": "StructuredDocumentation",
                    "src": "9750:135:0",
                    "text": " @dev Returns the addition of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 761,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryAdd",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 736,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 733,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 761,
                        "src": "9907:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 732,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9907:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 735,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 761,
                        "src": "9918:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 734,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9918:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9906:22:0"
                  },
                  "returnParameters": {
                    "id": 741,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 738,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 761,
                        "src": "9952:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 737,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9952:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 740,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 761,
                        "src": "9958:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 739,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9958:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9951:15:0"
                  },
                  "scope": 1082,
                  "src": "9891:178:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 787,
                    "nodeType": "Block",
                    "src": "10298:78:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 775,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 773,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 766,
                            "src": "10313:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 774,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 764,
                            "src": "10317:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10313:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 780,
                        "nodeType": "IfStatement",
                        "src": "10309:28:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 776,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10328:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 777,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10335:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 778,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "10327:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 772,
                          "id": 779,
                          "nodeType": "Return",
                          "src": "10320:17:0"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 781,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10356:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 784,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 782,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 764,
                                "src": "10362:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 783,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 766,
                                "src": "10366:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "10362:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 785,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "10355:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 772,
                        "id": 786,
                        "nodeType": "Return",
                        "src": "10348:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 762,
                    "nodeType": "StructuredDocumentation",
                    "src": "10077:139:0",
                    "text": " @dev Returns the substraction of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 788,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "trySub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 767,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 764,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 788,
                        "src": "10238:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 763,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10238:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 766,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 788,
                        "src": "10249:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 765,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10249:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10237:22:0"
                  },
                  "returnParameters": {
                    "id": 772,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 769,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 788,
                        "src": "10283:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 768,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10283:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 771,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 788,
                        "src": "10289:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 770,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10289:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10282:15:0"
                  },
                  "scope": 1082,
                  "src": "10222:154:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 828,
                    "nodeType": "Block",
                    "src": "10607:367:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 802,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 800,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 791,
                            "src": "10843:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 801,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "10848:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "10843:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 807,
                        "nodeType": "IfStatement",
                        "src": "10839:28:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 803,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10859:4:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 804,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10865:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 805,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "10858:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 799,
                          "id": 806,
                          "nodeType": "Return",
                          "src": "10851:16:0"
                        }
                      },
                      {
                        "assignments": [
                          809
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 809,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 828,
                            "src": "10878:9:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 808,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "10878:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 813,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 812,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 810,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 791,
                            "src": "10890:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 811,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 793,
                            "src": "10894:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10890:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "10878:17:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 818,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 816,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 814,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 809,
                              "src": "10910:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 815,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 791,
                              "src": "10914:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "10910:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 817,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 793,
                            "src": "10919:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10910:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 823,
                        "nodeType": "IfStatement",
                        "src": "10906:33:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 819,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10930:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 820,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10937:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 821,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "10929:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 799,
                          "id": 822,
                          "nodeType": "Return",
                          "src": "10922:17:0"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 824,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10958:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "id": 825,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 809,
                              "src": "10964:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 826,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "10957:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 799,
                        "id": 827,
                        "nodeType": "Return",
                        "src": "10950:16:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 789,
                    "nodeType": "StructuredDocumentation",
                    "src": "10384:141:0",
                    "text": " @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 829,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryMul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 791,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 829,
                        "src": "10547:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 790,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10547:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 793,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 829,
                        "src": "10558:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 792,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10558:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10546:22:0"
                  },
                  "returnParameters": {
                    "id": 799,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 796,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 829,
                        "src": "10592:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 795,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10592:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 798,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 829,
                        "src": "10598:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 797,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10598:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10591:15:0"
                  },
                  "scope": 1082,
                  "src": "10531:443:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 855,
                    "nodeType": "Block",
                    "src": "11206:79:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 843,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 841,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 834,
                            "src": "11221:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 842,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "11226:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "11221:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 848,
                        "nodeType": "IfStatement",
                        "src": "11217:29:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 844,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11237:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 845,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11244:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 846,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "11236:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 840,
                          "id": 847,
                          "nodeType": "Return",
                          "src": "11229:17:0"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 849,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11265:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 852,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 850,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 832,
                                "src": "11271:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "/",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 851,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 834,
                                "src": "11275:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "11271:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 853,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11264:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 840,
                        "id": 854,
                        "nodeType": "Return",
                        "src": "11257:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 830,
                    "nodeType": "StructuredDocumentation",
                    "src": "10982:142:0",
                    "text": " @dev Returns the division of two unsigned integers, with a division by zero flag.\n _Available since v3.4._"
                  },
                  "id": 856,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryDiv",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 835,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 832,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 856,
                        "src": "11146:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 831,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11146:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 834,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 856,
                        "src": "11157:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 833,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11157:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11145:22:0"
                  },
                  "returnParameters": {
                    "id": 840,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 837,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 856,
                        "src": "11191:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 836,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11191:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 839,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 856,
                        "src": "11197:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 838,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11197:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11190:15:0"
                  },
                  "scope": 1082,
                  "src": "11130:155:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 882,
                    "nodeType": "Block",
                    "src": "11527:79:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 868,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 861,
                            "src": "11542:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "11547:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "11542:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 875,
                        "nodeType": "IfStatement",
                        "src": "11538:29:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 871,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11558:5:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 872,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "11565:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 873,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "11557:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 867,
                          "id": 874,
                          "nodeType": "Return",
                          "src": "11550:17:0"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 876,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11586:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 879,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 877,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 859,
                                "src": "11592:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "%",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 878,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 861,
                                "src": "11596:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "11592:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 880,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11585:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 867,
                        "id": 881,
                        "nodeType": "Return",
                        "src": "11578:20:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 857,
                    "nodeType": "StructuredDocumentation",
                    "src": "11293:152:0",
                    "text": " @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n _Available since v3.4._"
                  },
                  "id": 883,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryMod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 862,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 859,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 883,
                        "src": "11467:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 858,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11467:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 861,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 883,
                        "src": "11478:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 860,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11478:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11466:22:0"
                  },
                  "returnParameters": {
                    "id": 867,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 864,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 883,
                        "src": "11512:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 863,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11512:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 866,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 883,
                        "src": "11518:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 865,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11518:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11511:15:0"
                  },
                  "scope": 1082,
                  "src": "11451:155:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 908,
                    "nodeType": "Block",
                    "src": "11920:112:0",
                    "statements": [
                      {
                        "assignments": [
                          894
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 894,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 908,
                            "src": "11931:9:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 893,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "11931:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 898,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 897,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 895,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 886,
                            "src": "11943:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 896,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 888,
                            "src": "11947:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "11943:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "11931:17:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 902,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 900,
                                "name": "c",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 894,
                                "src": "11967:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 901,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 886,
                                "src": "11972:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "11967:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
                              "id": 903,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11975:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              },
                              "value": "SafeMath: addition overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              }
                            ],
                            "id": 899,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "11959:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 904,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11959:46:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 905,
                        "nodeType": "ExpressionStatement",
                        "src": "11959:46:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 906,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 894,
                          "src": "12023:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 892,
                        "id": 907,
                        "nodeType": "Return",
                        "src": "12016:8:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 884,
                    "nodeType": "StructuredDocumentation",
                    "src": "11614:233:0",
                    "text": " @dev Returns the addition of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `+` operator.\n Requirements:\n - Addition cannot overflow."
                  },
                  "id": 909,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 889,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 886,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 909,
                        "src": "11866:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 885,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11866:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 888,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 909,
                        "src": "11877:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 887,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11877:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11865:22:0"
                  },
                  "returnParameters": {
                    "id": 892,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 891,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 909,
                        "src": "11911:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 890,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11911:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11910:9:0"
                  },
                  "scope": 1082,
                  "src": "11853:179:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 930,
                    "nodeType": "Block",
                    "src": "12382:91:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 922,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 920,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 914,
                                "src": "12401:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 921,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 912,
                                "src": "12406:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "12401:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a207375627472616374696f6e206f766572666c6f77",
                              "id": 923,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12409:32:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              },
                              "value": "SafeMath: subtraction overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              }
                            ],
                            "id": 919,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "12393:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 924,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12393:49:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 925,
                        "nodeType": "ExpressionStatement",
                        "src": "12393:49:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 926,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 912,
                            "src": "12460:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 927,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 914,
                            "src": "12464:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "12460:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 918,
                        "id": 929,
                        "nodeType": "Return",
                        "src": "12453:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 910,
                    "nodeType": "StructuredDocumentation",
                    "src": "12040:269:0",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting on\n overflow (when the result is negative).\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 931,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 915,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 912,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 931,
                        "src": "12328:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 911,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12328:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 914,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 931,
                        "src": "12339:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 913,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12339:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12327:22:0"
                  },
                  "returnParameters": {
                    "id": 918,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 917,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 931,
                        "src": "12373:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 916,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12373:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12372:9:0"
                  },
                  "scope": 1082,
                  "src": "12315:158:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 964,
                    "nodeType": "Block",
                    "src": "12799:153:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 941,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 934,
                            "src": "12814:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 942,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12819:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "12814:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 946,
                        "nodeType": "IfStatement",
                        "src": "12810:20:0",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 944,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12829:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "functionReturnParameters": 940,
                          "id": 945,
                          "nodeType": "Return",
                          "src": "12822:8:0"
                        }
                      },
                      {
                        "assignments": [
                          948
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 948,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 964,
                            "src": "12841:9:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 947,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "12841:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 952,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 951,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 949,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 934,
                            "src": "12853:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 950,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 936,
                            "src": "12857:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "12853:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "12841:17:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 958,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 956,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 954,
                                  "name": "c",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 948,
                                  "src": "12877:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 955,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 934,
                                  "src": "12881:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "12877:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 957,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 936,
                                "src": "12886:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "12877:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77",
                              "id": 959,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12889:35:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              },
                              "value": "SafeMath: multiplication overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              }
                            ],
                            "id": 953,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "12869:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 960,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12869:56:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 961,
                        "nodeType": "ExpressionStatement",
                        "src": "12869:56:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 962,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 948,
                          "src": "12943:1:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 940,
                        "id": 963,
                        "nodeType": "Return",
                        "src": "12936:8:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 932,
                    "nodeType": "StructuredDocumentation",
                    "src": "12481:245:0",
                    "text": " @dev Returns the multiplication of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `*` operator.\n Requirements:\n - Multiplication cannot overflow."
                  },
                  "id": 965,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 937,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 934,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "12745:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 933,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12745:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 936,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "12756:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 935,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12756:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12744:22:0"
                  },
                  "returnParameters": {
                    "id": 940,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 939,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "12790:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 938,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12790:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12789:9:0"
                  },
                  "scope": 1082,
                  "src": "12732:220:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 986,
                    "nodeType": "Block",
                    "src": "13497:86:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 978,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 976,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 970,
                                "src": "13516:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 977,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "13520:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "13516:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206469766973696f6e206279207a65726f",
                              "id": 979,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "13523:28:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              },
                              "value": "SafeMath: division by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              }
                            ],
                            "id": 975,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "13508:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 980,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13508:44:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 981,
                        "nodeType": "ExpressionStatement",
                        "src": "13508:44:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 984,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 982,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 968,
                            "src": "13570:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 983,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 970,
                            "src": "13574:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "13570:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 974,
                        "id": 985,
                        "nodeType": "Return",
                        "src": "13563:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 966,
                    "nodeType": "StructuredDocumentation",
                    "src": "12960:464:0",
                    "text": " @dev Returns the integer division of two unsigned integers, reverting on\n division by zero. The result is rounded towards zero.\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 Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 987,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 971,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 968,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 987,
                        "src": "13443:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 967,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13443:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 970,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 987,
                        "src": "13454:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 969,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13454:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13442:22:0"
                  },
                  "returnParameters": {
                    "id": 974,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 973,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 987,
                        "src": "13488:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 972,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13488:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13487:9:0"
                  },
                  "scope": 1082,
                  "src": "13430:153:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1008,
                    "nodeType": "Block",
                    "src": "14117:84:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1000,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 998,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 992,
                                "src": "14136:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 999,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "14140:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "14136:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d6f64756c6f206279207a65726f",
                              "id": 1001,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14143:26:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              },
                              "value": "SafeMath: modulo by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              }
                            ],
                            "id": 997,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14128:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14128:42:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1003,
                        "nodeType": "ExpressionStatement",
                        "src": "14128:42:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1006,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1004,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 990,
                            "src": "14188:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1005,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 992,
                            "src": "14192:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "14188:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 996,
                        "id": 1007,
                        "nodeType": "Return",
                        "src": "14181:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 988,
                    "nodeType": "StructuredDocumentation",
                    "src": "13591:453:0",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n reverting when dividing by zero.\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 Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1009,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 993,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 990,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1009,
                        "src": "14063:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 989,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14063:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 992,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1009,
                        "src": "14074:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 991,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14074:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14062:22:0"
                  },
                  "returnParameters": {
                    "id": 996,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 995,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1009,
                        "src": "14108:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 994,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14108:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14107:9:0"
                  },
                  "scope": 1082,
                  "src": "14050:151:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1032,
                    "nodeType": "Block",
                    "src": "14775:71:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1024,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1022,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1014,
                                "src": "14794:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1023,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1012,
                                "src": "14799:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "14794:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1025,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1016,
                              "src": "14802:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1021,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14786:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1026,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14786:29:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1027,
                        "nodeType": "ExpressionStatement",
                        "src": "14786:29:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1030,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1028,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1012,
                            "src": "14833:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1029,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1014,
                            "src": "14837:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "14833:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1020,
                        "id": 1031,
                        "nodeType": "Return",
                        "src": "14826:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1010,
                    "nodeType": "StructuredDocumentation",
                    "src": "14209:465:0",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n overflow (when the result is negative).\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {trySub}.\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 1033,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1017,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1012,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "14693:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1011,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14693:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1014,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "14704:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1013,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14704:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1016,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "14715:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1015,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "14715:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14692:50:0"
                  },
                  "returnParameters": {
                    "id": 1020,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1019,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "14766:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1018,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14766:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14765:9:0"
                  },
                  "scope": 1082,
                  "src": "14680:166:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1056,
                    "nodeType": "Block",
                    "src": "15615:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1048,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1046,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1038,
                                "src": "15634:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1047,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "15638:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "15634:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1049,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1040,
                              "src": "15641:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1045,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "15626:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1050,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15626:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1051,
                        "nodeType": "ExpressionStatement",
                        "src": "15626:28:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1054,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1052,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1036,
                            "src": "15672:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1053,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1038,
                            "src": "15676:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "15672:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1044,
                        "id": 1055,
                        "nodeType": "Return",
                        "src": "15665:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1034,
                    "nodeType": "StructuredDocumentation",
                    "src": "14854:660:0",
                    "text": " @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 CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {tryDiv}.\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 Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1057,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1041,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1036,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1057,
                        "src": "15533:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1035,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15533:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1038,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1057,
                        "src": "15544:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1037,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15544:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1040,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1057,
                        "src": "15555:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1039,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15555:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15532:50:0"
                  },
                  "returnParameters": {
                    "id": 1044,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1043,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1057,
                        "src": "15606:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1042,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15606:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15605:9:0"
                  },
                  "scope": 1082,
                  "src": "15520:165:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1080,
                    "nodeType": "Block",
                    "src": "16443:70:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1072,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1070,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1062,
                                "src": "16462:1:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1071,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "16466:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "16462:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1073,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1064,
                              "src": "16469:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1069,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "16454:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1074,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16454:28:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1075,
                        "nodeType": "ExpressionStatement",
                        "src": "16454:28:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1078,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1076,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1060,
                            "src": "16500:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1077,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1062,
                            "src": "16504:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "16500:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1068,
                        "id": 1079,
                        "nodeType": "Return",
                        "src": "16493:12:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1058,
                    "nodeType": "StructuredDocumentation",
                    "src": "15693:649:0",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n reverting with custom message when dividing by zero.\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {tryMod}.\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 Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1081,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1065,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1060,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1081,
                        "src": "16361:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1059,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16361:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1062,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1081,
                        "src": "16372:9:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1061,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16372:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1064,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1081,
                        "src": "16383:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1063,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "16383:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16360:50:0"
                  },
                  "returnParameters": {
                    "id": 1068,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1067,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1081,
                        "src": "16434:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1066,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16434:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16433:9:0"
                  },
                  "scope": 1082,
                  "src": "16348:165:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 2973,
              "src": "9726:6790:0"
            },
            {
              "id": 1083,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "16587:31:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 1084,
                "nodeType": "StructuredDocumentation",
                "src": "16622:69:0",
                "text": " @dev Collection of functions related to the address type"
              },
              "fullyImplemented": true,
              "id": 1377,
              "linearizedBaseContracts": [
                1377
              ],
              "name": "Address",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 1100,
                    "nodeType": "Block",
                    "src": "17369:356:0",
                    "statements": [
                      {
                        "assignments": [
                          1093
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1093,
                            "mutability": "mutable",
                            "name": "size",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1100,
                            "src": "17571:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1092,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "17571:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1094,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "17571:12:0"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "17660:32:0",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "17662:28:0",
                              "value": {
                                "arguments": [
                                  {
                                    "name": "account",
                                    "nodeType": "YulIdentifier",
                                    "src": "17682:7:0"
                                  }
                                ],
                                "functionName": {
                                  "name": "extcodesize",
                                  "nodeType": "YulIdentifier",
                                  "src": "17670:11:0"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "17670:20:0"
                              },
                              "variableNames": [
                                {
                                  "name": "size",
                                  "nodeType": "YulIdentifier",
                                  "src": "17662:4:0"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 1087,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "17682:7:0",
                            "valueSize": 1
                          },
                          {
                            "declaration": 1093,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "17662:4:0",
                            "valueSize": 1
                          }
                        ],
                        "id": 1095,
                        "nodeType": "InlineAssembly",
                        "src": "17651:41:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1098,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1096,
                            "name": "size",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1093,
                            "src": "17709:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1097,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17716:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "17709:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 1091,
                        "id": 1099,
                        "nodeType": "Return",
                        "src": "17702:15:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1085,
                    "nodeType": "StructuredDocumentation",
                    "src": "16716:581:0",
                    "text": " @dev Returns true if `account` is a contract.\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 Among others, `isContract` will return false for the following\n types of addresses:\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 ===="
                  },
                  "id": 1101,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isContract",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1088,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1087,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1101,
                        "src": "17323:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1086,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17323:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17322:17:0"
                  },
                  "returnParameters": {
                    "id": 1091,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1090,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1101,
                        "src": "17363:4:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1089,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "17363:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17362:6:0"
                  },
                  "scope": 1377,
                  "src": "17303:422:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1134,
                    "nodeType": "Block",
                    "src": "18731:326:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1116,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1112,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "18758:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Address_$1377",
                                        "typeString": "library Address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Address_$1377",
                                        "typeString": "library Address"
                                      }
                                    ],
                                    "id": 1111,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "18750:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1110,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "18750:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1113,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "18750:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 1114,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18750:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1115,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1106,
                                "src": "18775:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "18750:31:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20696e73756666696369656e742062616c616e6365",
                              "id": 1117,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "18783:31:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9",
                                "typeString": "literal_string \"Address: insufficient balance\""
                              },
                              "value": "Address: insufficient balance"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9",
                                "typeString": "literal_string \"Address: insufficient balance\""
                              }
                            ],
                            "id": 1109,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "18742:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1118,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18742:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1119,
                        "nodeType": "ExpressionStatement",
                        "src": "18742:73:0"
                      },
                      {
                        "assignments": [
                          1121,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1121,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1134,
                            "src": "18907:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1120,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "18907:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 1128,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "",
                              "id": 1126,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "18957:2:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1122,
                                "name": "recipient",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1104,
                                "src": "18925:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 1123,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "18925:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 1125,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 1124,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1106,
                                "src": "18948:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "18925:31:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 1127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18925:35:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "18906:54:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1130,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1121,
                              "src": "18979:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564",
                              "id": 1131,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "18988:60:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae",
                                "typeString": "literal_string \"Address: unable to send value, recipient may have reverted\""
                              },
                              "value": "Address: unable to send value, recipient may have reverted"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae",
                                "typeString": "literal_string \"Address: unable to send value, recipient may have reverted\""
                              }
                            ],
                            "id": 1129,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "18971:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1132,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18971:78:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1133,
                        "nodeType": "ExpressionStatement",
                        "src": "18971:78:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1102,
                    "nodeType": "StructuredDocumentation",
                    "src": "17733:921:0",
                    "text": " @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\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 https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\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]."
                  },
                  "id": 1135,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sendValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1107,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1104,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1135,
                        "src": "18679:25:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        "typeName": {
                          "id": 1103,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18679:15:0",
                          "stateMutability": "payable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1106,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1135,
                        "src": "18706:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1105,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18706:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18678:43:0"
                  },
                  "returnParameters": {
                    "id": 1108,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18731:0:0"
                  },
                  "scope": 1377,
                  "src": "18660:397:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1151,
                    "nodeType": "Block",
                    "src": "19907:86:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1146,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1138,
                              "src": "19938:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1147,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1140,
                              "src": "19946:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564",
                              "id": 1148,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "19952:32:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df",
                                "typeString": "literal_string \"Address: low-level call failed\""
                              },
                              "value": "Address: low-level call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df",
                                "typeString": "literal_string \"Address: low-level call failed\""
                              }
                            ],
                            "id": 1145,
                            "name": "functionCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1152,
                              1172
                            ],
                            "referencedDeclaration": 1172,
                            "src": "19925:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 1149,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19925:60:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1144,
                        "id": 1150,
                        "nodeType": "Return",
                        "src": "19918:67:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1136,
                    "nodeType": "StructuredDocumentation",
                    "src": "19065:747:0",
                    "text": " @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 If `target` reverts with a revert reason, it is bubbled up by this\n function (like regular Solidity function calls).\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 Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert.\n _Available since v3.1._"
                  },
                  "id": 1152,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1141,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1138,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1152,
                        "src": "19840:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1137,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19840:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1140,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1152,
                        "src": "19856:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1139,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "19856:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19839:35:0"
                  },
                  "returnParameters": {
                    "id": 1144,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1143,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1152,
                        "src": "19893:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1142,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "19893:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19892:14:0"
                  },
                  "scope": 1377,
                  "src": "19818:175:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1171,
                    "nodeType": "Block",
                    "src": "20340:78:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1165,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1155,
                              "src": "20380:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1166,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1157,
                              "src": "20388:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 1167,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "20394:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            {
                              "argumentTypes": null,
                              "id": 1168,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1159,
                              "src": "20397:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1164,
                            "name": "functionCallWithValue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1192,
                              1242
                            ],
                            "referencedDeclaration": 1242,
                            "src": "20358:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,uint256,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 1169,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20358:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1163,
                        "id": 1170,
                        "nodeType": "Return",
                        "src": "20351:59:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1153,
                    "nodeType": "StructuredDocumentation",
                    "src": "20001:216:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"
                  },
                  "id": 1172,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1155,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1172,
                        "src": "20245:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1154,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20245:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1157,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1172,
                        "src": "20261:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1156,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "20261:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1159,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1172,
                        "src": "20280:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1158,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20280:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20244:63:0"
                  },
                  "returnParameters": {
                    "id": 1163,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1162,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1172,
                        "src": "20326:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1161,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "20326:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20325:14:0"
                  },
                  "scope": 1377,
                  "src": "20223:195:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1191,
                    "nodeType": "Block",
                    "src": "20906:113:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1185,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1175,
                              "src": "20946:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1186,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1177,
                              "src": "20954:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1187,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1179,
                              "src": "20960:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564",
                              "id": 1188,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "20967:43:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc",
                                "typeString": "literal_string \"Address: low-level call with value failed\""
                              },
                              "value": "Address: low-level call with value failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc",
                                "typeString": "literal_string \"Address: low-level call with value failed\""
                              }
                            ],
                            "id": 1184,
                            "name": "functionCallWithValue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1192,
                              1242
                            ],
                            "referencedDeclaration": 1242,
                            "src": "20924:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,uint256,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 1189,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20924:87:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1183,
                        "id": 1190,
                        "nodeType": "Return",
                        "src": "20917:94:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1173,
                    "nodeType": "StructuredDocumentation",
                    "src": "20426:361:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`.\n _Available since v3.1._"
                  },
                  "id": 1192,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCallWithValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1180,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1175,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1192,
                        "src": "20824:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1174,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20824:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1177,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1192,
                        "src": "20840:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1176,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "20840:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1179,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1192,
                        "src": "20859:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1178,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20859:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20823:50:0"
                  },
                  "returnParameters": {
                    "id": 1183,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1182,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1192,
                        "src": "20892:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1181,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "20892:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20891:14:0"
                  },
                  "scope": 1377,
                  "src": "20793:226:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1241,
                    "nodeType": "Block",
                    "src": "21416:389:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1213,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1209,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "21443:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Address_$1377",
                                        "typeString": "library Address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Address_$1377",
                                        "typeString": "library Address"
                                      }
                                    ],
                                    "id": 1208,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "21435:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1207,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "21435:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1210,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "21435:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 1211,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21435:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1212,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1199,
                                "src": "21460:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "21435:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c",
                              "id": 1214,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "21467:40:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c",
                                "typeString": "literal_string \"Address: insufficient balance for call\""
                              },
                              "value": "Address: insufficient balance for call"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c",
                                "typeString": "literal_string \"Address: insufficient balance for call\""
                              }
                            ],
                            "id": 1206,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "21427:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1215,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21427:81:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1216,
                        "nodeType": "ExpressionStatement",
                        "src": "21427:81:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1219,
                                  "name": "target",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1195,
                                  "src": "21538:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1218,
                                "name": "isContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1101,
                                "src": "21527:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 1220,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21527:18:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374",
                              "id": 1221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "21547:31:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad",
                                "typeString": "literal_string \"Address: call to non-contract\""
                              },
                              "value": "Address: call to non-contract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad",
                                "typeString": "literal_string \"Address: call to non-contract\""
                              }
                            ],
                            "id": 1217,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "21519:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21519:60:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1223,
                        "nodeType": "ExpressionStatement",
                        "src": "21519:60:0"
                      },
                      {
                        "assignments": [
                          1225,
                          1227
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1225,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1241,
                            "src": "21653:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1224,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "21653:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1227,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1241,
                            "src": "21667:23:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1226,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "21667:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1234,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1232,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1197,
                              "src": "21722:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1228,
                                "name": "target",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1195,
                                "src": "21694:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 1229,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "21694:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 1231,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 1230,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1199,
                                "src": "21714:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "21694:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 1233,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21694:33:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "21652:75:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1236,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1225,
                              "src": "21763:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1237,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1227,
                              "src": "21772:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1238,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1201,
                              "src": "21784:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1235,
                            "name": "_verifyCallResult",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1376,
                            "src": "21745:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bool,bytes memory,string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 1239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21745:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1205,
                        "id": 1240,
                        "nodeType": "Return",
                        "src": "21738:59:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1193,
                    "nodeType": "StructuredDocumentation",
                    "src": "21027:242:0",
                    "text": " @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n with `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"
                  },
                  "id": 1242,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCallWithValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1202,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1195,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1242,
                        "src": "21306:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1194,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21306:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1197,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1242,
                        "src": "21322:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1196,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "21322:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1199,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1242,
                        "src": "21341:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1198,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21341:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1201,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1242,
                        "src": "21356:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1200,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21356:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21305:78:0"
                  },
                  "returnParameters": {
                    "id": 1205,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1204,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1242,
                        "src": "21402:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1203,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "21402:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21401:14:0"
                  },
                  "scope": 1377,
                  "src": "21275:530:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1258,
                    "nodeType": "Block",
                    "src": "22090:99:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1253,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1245,
                              "src": "22127:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1254,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1247,
                              "src": "22135:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c207374617469632063616c6c206661696c6564",
                              "id": 1255,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22141:39:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0",
                                "typeString": "literal_string \"Address: low-level static call failed\""
                              },
                              "value": "Address: low-level static call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0",
                                "typeString": "literal_string \"Address: low-level static call failed\""
                              }
                            ],
                            "id": 1252,
                            "name": "functionStaticCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1259,
                              1294
                            ],
                            "referencedDeclaration": 1294,
                            "src": "22108:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,string memory) view returns (bytes memory)"
                            }
                          },
                          "id": 1256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22108:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1251,
                        "id": 1257,
                        "nodeType": "Return",
                        "src": "22101:80:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1243,
                    "nodeType": "StructuredDocumentation",
                    "src": "21813:171:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"
                  },
                  "id": 1259,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionStaticCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1248,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1245,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1259,
                        "src": "22018:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1244,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22018:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1247,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1259,
                        "src": "22034:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1246,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22034:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22017:35:0"
                  },
                  "returnParameters": {
                    "id": 1251,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1250,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1259,
                        "src": "22076:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1249,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22076:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22075:14:0"
                  },
                  "scope": 1377,
                  "src": "21990:199:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1293,
                    "nodeType": "Block",
                    "src": "22509:294:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1273,
                                  "name": "target",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1262,
                                  "src": "22539:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1272,
                                "name": "isContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1101,
                                "src": "22528:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 1274,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22528:18:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a207374617469632063616c6c20746f206e6f6e2d636f6e7472616374",
                              "id": 1275,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22548:38:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c79cc78e4f16ce3933a42b84c73868f93bb4a59c031a0acf576679de98c608a9",
                                "typeString": "literal_string \"Address: static call to non-contract\""
                              },
                              "value": "Address: static call to non-contract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c79cc78e4f16ce3933a42b84c73868f93bb4a59c031a0acf576679de98c608a9",
                                "typeString": "literal_string \"Address: static call to non-contract\""
                              }
                            ],
                            "id": 1271,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22520:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1276,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22520:67:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1277,
                        "nodeType": "ExpressionStatement",
                        "src": "22520:67:0"
                      },
                      {
                        "assignments": [
                          1279,
                          1281
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1279,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1293,
                            "src": "22661:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1278,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "22661:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1281,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1293,
                            "src": "22675:23:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1280,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "22675:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1286,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1284,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1264,
                              "src": "22720:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1282,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1262,
                              "src": "22702:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1283,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "22702:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 1285,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22702:23:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "22660:65:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1288,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1279,
                              "src": "22761:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1289,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1281,
                              "src": "22770:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1290,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1266,
                              "src": "22782:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1287,
                            "name": "_verifyCallResult",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1376,
                            "src": "22743:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bool,bytes memory,string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 1291,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22743:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1270,
                        "id": 1292,
                        "nodeType": "Return",
                        "src": "22736:59:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1260,
                    "nodeType": "StructuredDocumentation",
                    "src": "22197:178:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"
                  },
                  "id": 1294,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionStaticCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1267,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1262,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1294,
                        "src": "22409:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1261,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22409:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1264,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1294,
                        "src": "22425:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1263,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22425:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1266,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1294,
                        "src": "22444:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1265,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22444:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22408:63:0"
                  },
                  "returnParameters": {
                    "id": 1270,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1269,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1294,
                        "src": "22495:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1268,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "22495:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22494:14:0"
                  },
                  "scope": 1377,
                  "src": "22381:422:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1310,
                    "nodeType": "Block",
                    "src": "23087:103:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1305,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1297,
                              "src": "23126:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1306,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1299,
                              "src": "23134:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564",
                              "id": 1307,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "23140:41:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398",
                                "typeString": "literal_string \"Address: low-level delegate call failed\""
                              },
                              "value": "Address: low-level delegate call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9fdcd12e4b726339b32a442b0a448365d5d85c96b2d2cff917b4f66c63110398",
                                "typeString": "literal_string \"Address: low-level delegate call failed\""
                              }
                            ],
                            "id": 1304,
                            "name": "functionDelegateCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              1311,
                              1346
                            ],
                            "referencedDeclaration": 1346,
                            "src": "23105:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 1308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23105:77:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1303,
                        "id": 1309,
                        "nodeType": "Return",
                        "src": "23098:84:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1295,
                    "nodeType": "StructuredDocumentation",
                    "src": "22811:173:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"
                  },
                  "id": 1311,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionDelegateCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1300,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1297,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1311,
                        "src": "23020:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1296,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23020:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1299,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1311,
                        "src": "23036:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1298,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23036:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23019:35:0"
                  },
                  "returnParameters": {
                    "id": 1303,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1302,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1311,
                        "src": "23073:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1301,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23073:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23072:14:0"
                  },
                  "scope": 1377,
                  "src": "22990:200:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1345,
                    "nodeType": "Block",
                    "src": "23509:298:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1325,
                                  "name": "target",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1314,
                                  "src": "23539:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1324,
                                "name": "isContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1101,
                                "src": "23528:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 1326,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23528:18:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6e7472616374",
                              "id": 1327,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "23548:40:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b94ded0918034cf8f896e19fa3cfdef1188cd569c577264a3622e49152f88520",
                                "typeString": "literal_string \"Address: delegate call to non-contract\""
                              },
                              "value": "Address: delegate call to non-contract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b94ded0918034cf8f896e19fa3cfdef1188cd569c577264a3622e49152f88520",
                                "typeString": "literal_string \"Address: delegate call to non-contract\""
                              }
                            ],
                            "id": 1323,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "23520:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1328,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23520:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1329,
                        "nodeType": "ExpressionStatement",
                        "src": "23520:69:0"
                      },
                      {
                        "assignments": [
                          1331,
                          1333
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1331,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1345,
                            "src": "23663:12:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1330,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "23663:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 1333,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1345,
                            "src": "23677:23:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1332,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "23677:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1338,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1336,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1316,
                              "src": "23724:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1334,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1314,
                              "src": "23704:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1335,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "delegatecall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "23704:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) returns (bool,bytes memory)"
                            }
                          },
                          "id": 1337,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23704:25:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "23662:67:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1340,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1331,
                              "src": "23765:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1341,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1333,
                              "src": "23774:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1342,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1318,
                              "src": "23786:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1339,
                            "name": "_verifyCallResult",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1376,
                            "src": "23747:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bool,bytes memory,string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 1343,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23747:52:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 1322,
                        "id": 1344,
                        "nodeType": "Return",
                        "src": "23740:59:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1312,
                    "nodeType": "StructuredDocumentation",
                    "src": "23198:180:0",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a delegate call.\n _Available since v3.4._"
                  },
                  "id": 1346,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionDelegateCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1319,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1314,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1346,
                        "src": "23414:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1313,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23414:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1316,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1346,
                        "src": "23430:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1315,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23430:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1318,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1346,
                        "src": "23449:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1317,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23449:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23413:63:0"
                  },
                  "returnParameters": {
                    "id": 1322,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1321,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1346,
                        "src": "23495:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1320,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23495:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23494:14:0"
                  },
                  "scope": 1377,
                  "src": "23384:423:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1375,
                    "nodeType": "Block",
                    "src": "23944:613:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 1357,
                          "name": "success",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1348,
                          "src": "23959:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 1373,
                          "nodeType": "Block",
                          "src": "24018:532:0",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1364,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 1361,
                                    "name": "returndata",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1350,
                                    "src": "24104:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "id": 1362,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "24104:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1363,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24124:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "24104:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "id": 1371,
                                "nodeType": "Block",
                                "src": "24484:55:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 1368,
                                          "name": "errorMessage",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1352,
                                          "src": "24510:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        ],
                                        "id": 1367,
                                        "name": "revert",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          -19,
                                          -19
                                        ],
                                        "referencedDeclaration": -19,
                                        "src": "24503:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                          "typeString": "function (string memory) pure"
                                        }
                                      },
                                      "id": 1369,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "24503:20:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 1370,
                                    "nodeType": "ExpressionStatement",
                                    "src": "24503:20:0"
                                  }
                                ]
                              },
                              "id": 1372,
                              "nodeType": "IfStatement",
                              "src": "24100:439:0",
                              "trueBody": {
                                "id": 1366,
                                "nodeType": "Block",
                                "src": "24127:351:0",
                                "statements": [
                                  {
                                    "AST": {
                                      "nodeType": "YulBlock",
                                      "src": "24315:148:0",
                                      "statements": [
                                        {
                                          "nodeType": "YulVariableDeclaration",
                                          "src": "24338:40:0",
                                          "value": {
                                            "arguments": [
                                              {
                                                "name": "returndata",
                                                "nodeType": "YulIdentifier",
                                                "src": "24367:10:0"
                                              }
                                            ],
                                            "functionName": {
                                              "name": "mload",
                                              "nodeType": "YulIdentifier",
                                              "src": "24361:5:0"
                                            },
                                            "nodeType": "YulFunctionCall",
                                            "src": "24361:17:0"
                                          },
                                          "variables": [
                                            {
                                              "name": "returndata_size",
                                              "nodeType": "YulTypedName",
                                              "src": "24342:15:0",
                                              "type": ""
                                            }
                                          ]
                                        },
                                        {
                                          "expression": {
                                            "arguments": [
                                              {
                                                "arguments": [
                                                  {
                                                    "kind": "number",
                                                    "nodeType": "YulLiteral",
                                                    "src": "24411:2:0",
                                                    "type": "",
                                                    "value": "32"
                                                  },
                                                  {
                                                    "name": "returndata",
                                                    "nodeType": "YulIdentifier",
                                                    "src": "24415:10:0"
                                                  }
                                                ],
                                                "functionName": {
                                                  "name": "add",
                                                  "nodeType": "YulIdentifier",
                                                  "src": "24407:3:0"
                                                },
                                                "nodeType": "YulFunctionCall",
                                                "src": "24407:19:0"
                                              },
                                              {
                                                "name": "returndata_size",
                                                "nodeType": "YulIdentifier",
                                                "src": "24428:15:0"
                                              }
                                            ],
                                            "functionName": {
                                              "name": "revert",
                                              "nodeType": "YulIdentifier",
                                              "src": "24400:6:0"
                                            },
                                            "nodeType": "YulFunctionCall",
                                            "src": "24400:44:0"
                                          },
                                          "nodeType": "YulExpressionStatement",
                                          "src": "24400:44:0"
                                        }
                                      ]
                                    },
                                    "evmVersion": "istanbul",
                                    "externalReferences": [
                                      {
                                        "declaration": 1350,
                                        "isOffset": false,
                                        "isSlot": false,
                                        "src": "24367:10:0",
                                        "valueSize": 1
                                      },
                                      {
                                        "declaration": 1350,
                                        "isOffset": false,
                                        "isSlot": false,
                                        "src": "24415:10:0",
                                        "valueSize": 1
                                      }
                                    ],
                                    "id": 1365,
                                    "nodeType": "InlineAssembly",
                                    "src": "24306:157:0"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 1374,
                        "nodeType": "IfStatement",
                        "src": "23955:595:0",
                        "trueBody": {
                          "id": 1360,
                          "nodeType": "Block",
                          "src": "23968:44:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1358,
                                "name": "returndata",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1350,
                                "src": "23990:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "functionReturnParameters": 1356,
                              "id": 1359,
                              "nodeType": "Return",
                              "src": "23983:17:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1376,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_verifyCallResult",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1353,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1348,
                        "mutability": "mutable",
                        "name": "success",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1376,
                        "src": "23842:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1347,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23842:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1350,
                        "mutability": "mutable",
                        "name": "returndata",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1376,
                        "src": "23856:23:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1349,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23856:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1352,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1376,
                        "src": "23881:26:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1351,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23881:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23841:67:0"
                  },
                  "returnParameters": {
                    "id": 1356,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1355,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1376,
                        "src": "23930:12:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1354,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "23930:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23929:14:0"
                  },
                  "scope": 1377,
                  "src": "23815:742:0",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 2973,
              "src": "16693:7867:0"
            },
            {
              "id": 1378,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "24624:31:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 1379,
                "nodeType": "StructuredDocumentation",
                "src": "24661:465:0",
                "text": " @title SafeERC20\n @dev Wrappers around ERC20 operations that throw on failure (when the token\n contract returns false). Tokens that return no value (and instead revert or\n throw on failure) are also supported, non-reverting calls are assumed to be\n successful.\n To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n which allows you to call the safe operations as `token.safeTransfer(...)`, etc."
              },
              "fullyImplemented": true,
              "id": 1586,
              "linearizedBaseContracts": [
                1586
              ],
              "name": "SafeERC20",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1382,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1380,
                    "name": "SafeMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1082,
                    "src": "25159:8:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMath_$1082",
                      "typeString": "library SafeMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "25153:27:0",
                  "typeName": {
                    "id": 1381,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "25172:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 1385,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1383,
                    "name": "Address",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1377,
                    "src": "25192:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Address_$1377",
                      "typeString": "library Address"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "25186:26:0",
                  "typeName": {
                    "id": 1384,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "25204:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "body": {
                    "id": 1406,
                    "nodeType": "Block",
                    "src": "25292:105:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1395,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1387,
                              "src": "25323:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1398,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1387,
                                      "src": "25353:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1399,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "transfer",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 677,
                                    "src": "25353:14:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1400,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "25353:23:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1401,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1389,
                                  "src": "25378:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1402,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1391,
                                  "src": "25382:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1396,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25330:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1397,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25330:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1403,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25330:58:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1394,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1585,
                            "src": "25303:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20,bytes memory)"
                            }
                          },
                          "id": 1404,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25303:86:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1405,
                        "nodeType": "ExpressionStatement",
                        "src": "25303:86:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1407,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1392,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1387,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1407,
                        "src": "25242:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1386,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "25242:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1389,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1407,
                        "src": "25256:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1388,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25256:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1391,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1407,
                        "src": "25268:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1390,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25268:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25241:41:0"
                  },
                  "returnParameters": {
                    "id": 1393,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25292:0:0"
                  },
                  "scope": 1586,
                  "src": "25220:177:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1431,
                    "nodeType": "Block",
                    "src": "25495:115:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1419,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1409,
                              "src": "25526:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1422,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1409,
                                      "src": "25556:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1423,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "transferFrom",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 709,
                                    "src": "25556:18:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1424,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "25556:27:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1425,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1411,
                                  "src": "25585:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1426,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1413,
                                  "src": "25591:2:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1427,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1415,
                                  "src": "25595:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1420,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25533:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1421,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25533:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1428,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25533:68:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1418,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1585,
                            "src": "25506:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20,bytes memory)"
                            }
                          },
                          "id": 1429,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25506:96:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1430,
                        "nodeType": "ExpressionStatement",
                        "src": "25506:96:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1432,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1416,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1409,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1432,
                        "src": "25431:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1408,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "25431:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1411,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1432,
                        "src": "25445:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1410,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25445:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1413,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1432,
                        "src": "25459:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1412,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25459:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1415,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1432,
                        "src": "25471:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1414,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25471:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25430:55:0"
                  },
                  "returnParameters": {
                    "id": 1417,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25495:0:0"
                  },
                  "scope": 1586,
                  "src": "25405:205:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1474,
                    "nodeType": "Block",
                    "src": "25955:546:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1458,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 1445,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 1443,
                                      "name": "value",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1439,
                                      "src": "26249:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 1444,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "26258:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "26249:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 1446,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "26248:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 1456,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 1451,
                                              "name": "this",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -28,
                                              "src": "26289:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                                "typeString": "library SafeERC20"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                                "typeString": "library SafeERC20"
                                              }
                                            ],
                                            "id": 1450,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "26281:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 1449,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "26281:7:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 1452,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "26281:13:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 1453,
                                          "name": "spender",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1437,
                                          "src": "26296:7:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 1447,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1435,
                                          "src": "26265:5:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20_$728",
                                            "typeString": "contract IERC20"
                                          }
                                        },
                                        "id": 1448,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "allowance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 687,
                                        "src": "26265:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                          "typeString": "function (address,address) view external returns (uint256)"
                                        }
                                      },
                                      "id": 1454,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "26265:39:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 1455,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "26308:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "26265:44:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 1457,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "26264:46:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "26248:62:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365",
                              "id": 1459,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "26325:56:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25",
                                "typeString": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""
                              },
                              "value": "SafeERC20: approve from non-zero to non-zero allowance"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25",
                                "typeString": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""
                              }
                            ],
                            "id": 1442,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "26240:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1460,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26240:152:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1461,
                        "nodeType": "ExpressionStatement",
                        "src": "26240:152:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1463,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1435,
                              "src": "26423:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1466,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1435,
                                      "src": "26453:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1467,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 697,
                                    "src": "26453:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1468,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "26453:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1469,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1437,
                                  "src": "26477:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1470,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1439,
                                  "src": "26486:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1464,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26430:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1465,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26430:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1471,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26430:62:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1462,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1585,
                            "src": "26403:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20,bytes memory)"
                            }
                          },
                          "id": 1472,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26403:90:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1473,
                        "nodeType": "ExpressionStatement",
                        "src": "26403:90:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1433,
                    "nodeType": "StructuredDocumentation",
                    "src": "25618:255:0",
                    "text": " @dev Deprecated. This function has issues similar to the ones found in\n {IERC20-approve}, and its usage is discouraged.\n Whenever possible, use {safeIncreaseAllowance} and\n {safeDecreaseAllowance} instead."
                  },
                  "id": 1475,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeApprove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1435,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1475,
                        "src": "25900:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1434,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "25900:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1437,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1475,
                        "src": "25914:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1436,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25914:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1439,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1475,
                        "src": "25931:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1438,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25931:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25899:46:0"
                  },
                  "returnParameters": {
                    "id": 1441,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25955:0:0"
                  },
                  "scope": 1586,
                  "src": "25879:622:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1510,
                    "nodeType": "Block",
                    "src": "26595:200:0",
                    "statements": [
                      {
                        "assignments": [
                          1485
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1485,
                            "mutability": "mutable",
                            "name": "newAllowance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1510,
                            "src": "26606:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1484,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "26606:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1497,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1495,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1481,
                              "src": "26673:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1490,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "26653:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                        "typeString": "library SafeERC20"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                        "typeString": "library SafeERC20"
                                      }
                                    ],
                                    "id": 1489,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "26645:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1488,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "26645:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1491,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "26645:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1492,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1479,
                                  "src": "26660:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1486,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1477,
                                  "src": "26629:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "id": 1487,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "allowance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 687,
                                "src": "26629:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address,address) view external returns (uint256)"
                                }
                              },
                              "id": 1493,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26629:39:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1494,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 909,
                            "src": "26629:43:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 1496,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26629:50:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "26606:73:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1499,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1477,
                              "src": "26710:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1502,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1477,
                                      "src": "26740:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1503,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 697,
                                    "src": "26740:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1504,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "26740:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1505,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1479,
                                  "src": "26764:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1506,
                                  "name": "newAllowance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1485,
                                  "src": "26773:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1500,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26717:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1501,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26717:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1507,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26717:69:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1498,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1585,
                            "src": "26690:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20,bytes memory)"
                            }
                          },
                          "id": 1508,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26690:97:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1509,
                        "nodeType": "ExpressionStatement",
                        "src": "26690:97:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1511,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeIncreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1482,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1477,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1511,
                        "src": "26540:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1476,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "26540:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1479,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1511,
                        "src": "26554:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1478,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26554:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1481,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1511,
                        "src": "26571:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1480,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "26571:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26539:46:0"
                  },
                  "returnParameters": {
                    "id": 1483,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26595:0:0"
                  },
                  "scope": 1586,
                  "src": "26509:286:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1547,
                    "nodeType": "Block",
                    "src": "26889:245:0",
                    "statements": [
                      {
                        "assignments": [
                          1521
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1521,
                            "mutability": "mutable",
                            "name": "newAllowance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1547,
                            "src": "26900:20:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1520,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "26900:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1534,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1531,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1517,
                              "src": "26967:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f",
                              "id": 1532,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "26974:43:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a",
                                "typeString": "literal_string \"SafeERC20: decreased allowance below zero\""
                              },
                              "value": "SafeERC20: decreased allowance below zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a",
                                "typeString": "literal_string \"SafeERC20: decreased allowance below zero\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1526,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "26947:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                        "typeString": "library SafeERC20"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_SafeERC20_$1586",
                                        "typeString": "library SafeERC20"
                                      }
                                    ],
                                    "id": 1525,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "26939:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 1524,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "26939:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 1527,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "26939:13:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1528,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1515,
                                  "src": "26954:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1522,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1513,
                                  "src": "26923:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "id": 1523,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "allowance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 687,
                                "src": "26923:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address,address) view external returns (uint256)"
                                }
                              },
                              "id": 1529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26923:39:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1530,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1033,
                            "src": "26923:43:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                            }
                          },
                          "id": 1533,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26923:95:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "26900:118:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1536,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1513,
                              "src": "27049:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1539,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1513,
                                      "src": "27079:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "id": 1540,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 697,
                                    "src": "27079:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1541,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "27079:22:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1542,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1515,
                                  "src": "27103:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1543,
                                  "name": "newAllowance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1521,
                                  "src": "27112:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1537,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27056:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1538,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27056:22:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1544,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27056:69:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1535,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1585,
                            "src": "27029:19:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20,bytes memory)"
                            }
                          },
                          "id": 1545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27029:97:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1546,
                        "nodeType": "ExpressionStatement",
                        "src": "27029:97:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1548,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeDecreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1518,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1513,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1548,
                        "src": "26834:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1512,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "26834:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1515,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1548,
                        "src": "26848:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1514,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26848:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1517,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1548,
                        "src": "26865:13:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1516,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "26865:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26833:46:0"
                  },
                  "returnParameters": {
                    "id": 1519,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26889:0:0"
                  },
                  "scope": 1586,
                  "src": "26803:331:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1584,
                    "nodeType": "Block",
                    "src": "27595:691:0",
                    "statements": [
                      {
                        "assignments": [
                          1557
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1557,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1584,
                            "src": "27949:23:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 1556,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "27949:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1566,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1563,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1553,
                              "src": "28003:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564",
                              "id": 1564,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28009:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                                "typeString": "literal_string \"SafeERC20: low-level call failed\""
                              },
                              "value": "SafeERC20: low-level call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                                "typeString": "literal_string \"SafeERC20: low-level call failed\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1560,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1551,
                                  "src": "27983:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                ],
                                "id": 1559,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "27975:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1558,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "27975:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1561,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27975:14:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 1562,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "functionCall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1172,
                            "src": "27975:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$bound_to$_t_address_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 1565,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27975:69:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "27949:95:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1570,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 1567,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1557,
                              "src": "28059:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 1568,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "28059:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1569,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "28079:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "28059:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1583,
                        "nodeType": "IfStatement",
                        "src": "28055:224:0",
                        "trueBody": {
                          "id": 1582,
                          "nodeType": "Block",
                          "src": "28082:197:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 1574,
                                        "name": "returndata",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1557,
                                        "src": "28201:10:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "components": [
                                          {
                                            "argumentTypes": null,
                                            "id": 1576,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "28214:4:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_bool_$",
                                              "typeString": "type(bool)"
                                            },
                                            "typeName": {
                                              "id": 1575,
                                              "name": "bool",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "28214:4:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          }
                                        ],
                                        "id": 1577,
                                        "isConstant": false,
                                        "isInlineArray": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "TupleExpression",
                                        "src": "28213:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_bool_$",
                                          "typeString": "type(bool)"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        },
                                        {
                                          "typeIdentifier": "t_type$_t_bool_$",
                                          "typeString": "type(bool)"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 1572,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "28190:3:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 1573,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "decode",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "28190:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                        "typeString": "function () pure"
                                      }
                                    },
                                    "id": 1578,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "28190:30:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564",
                                    "id": 1579,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "28222:44:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd",
                                      "typeString": "literal_string \"SafeERC20: ERC20 operation did not succeed\""
                                    },
                                    "value": "SafeERC20: ERC20 operation did not succeed"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd",
                                      "typeString": "literal_string \"SafeERC20: ERC20 operation did not succeed\""
                                    }
                                  ],
                                  "id": 1571,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "28182:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 1580,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28182:85:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 1581,
                              "nodeType": "ExpressionStatement",
                              "src": "28182:85:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1549,
                    "nodeType": "StructuredDocumentation",
                    "src": "27142:377:0",
                    "text": " @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n on the return value: the return value is optional (but if data is returned, it must not be false).\n @param token The token targeted by the call.\n @param data The call data (encoded using abi.encode or one of its variants)."
                  },
                  "id": 1585,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_callOptionalReturn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1554,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1551,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1585,
                        "src": "27554:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1550,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "27554:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1553,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1585,
                        "src": "27568:17:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 1552,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "27568:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27553:33:0"
                  },
                  "returnParameters": {
                    "id": 1555,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27595:0:0"
                  },
                  "scope": 1586,
                  "src": "27525:761:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 2973,
              "src": "25128:3161:0"
            },
            {
              "id": 1587,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "28346:23:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1619,
              "linearizedBaseContracts": [
                1619
              ],
              "name": "ITattooRewarder",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1590,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1588,
                    "name": "SafeERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1586,
                    "src": "28412:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20_$1586",
                      "typeString": "library SafeERC20"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "28406:27:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1589,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 728,
                    "src": "28426:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$728",
                      "typeString": "contract IERC20"
                    }
                  }
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "e24c7613",
                  "id": 1603,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onTattooReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1601,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1592,
                        "mutability": "mutable",
                        "name": "pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1603,
                        "src": "28463:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1591,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28463:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1594,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1603,
                        "src": "28476:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1593,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28476:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1596,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1603,
                        "src": "28490:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1595,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28490:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1598,
                        "mutability": "mutable",
                        "name": "tattooAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1603,
                        "src": "28509:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1597,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28509:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1600,
                        "mutability": "mutable",
                        "name": "newLpAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1603,
                        "src": "28531:19:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1599,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28531:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28462:89:0"
                  },
                  "returnParameters": {
                    "id": 1602,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28560:0:0"
                  },
                  "scope": 1619,
                  "src": "28439:122:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "d63b3c49",
                  "id": 1618,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "pendingTokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1610,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1605,
                        "mutability": "mutable",
                        "name": "pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1618,
                        "src": "28590:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1604,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28590:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1607,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1618,
                        "src": "28603:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1606,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28603:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1609,
                        "mutability": "mutable",
                        "name": "tattooAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1618,
                        "src": "28617:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1608,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "28617:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28589:49:0"
                  },
                  "returnParameters": {
                    "id": 1617,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1613,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1618,
                        "src": "28662:15:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 1611,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 728,
                            "src": "28662:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 1612,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "28662:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1616,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1618,
                        "src": "28679:16:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 1614,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "28679:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 1615,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "28679:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28661:35:0"
                  },
                  "scope": 1619,
                  "src": "28567:130:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "28373:327:0"
            },
            {
              "id": 1620,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "28747:23:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 1621,
                "nodeType": "StructuredDocumentation",
                "src": "28772:68:0",
                "text": "Submitted for verification at Etherscan.io on 2020-07-17"
              },
              "fullyImplemented": false,
              "id": 1629,
              "linearizedBaseContracts": [
                1629
              ],
              "name": "IMasterChefV2",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "78ed5d1f",
                  "id": 1628,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "lpToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1624,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1623,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1628,
                        "src": "30274:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1622,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30274:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30273:8:0"
                  },
                  "returnParameters": {
                    "id": 1627,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1626,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1628,
                        "src": "30305:6:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1625,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "30305:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30304:8:0"
                  },
                  "scope": 1629,
                  "src": "30257:56:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "30226:90:0"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 1655,
              "linearizedBaseContracts": [
                1655
              ],
              "name": "IConvexChef",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "93f1a40b",
                  "id": 1640,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "userInfo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1634,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1631,
                        "mutability": "mutable",
                        "name": "_pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1640,
                        "src": "30366:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1630,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30366:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1633,
                        "mutability": "mutable",
                        "name": "_account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1640,
                        "src": "30380:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1632,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30380:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30365:32:0"
                  },
                  "returnParameters": {
                    "id": 1639,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1636,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1640,
                        "src": "30420:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1635,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30420:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1638,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1640,
                        "src": "30428:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1637,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30428:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30419:17:0"
                  },
                  "scope": 1655,
                  "src": "30348:89:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "ddd5e1b2",
                  "id": 1647,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1645,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1642,
                        "mutability": "mutable",
                        "name": "_pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1647,
                        "src": "30458:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1641,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30458:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1644,
                        "mutability": "mutable",
                        "name": "_account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1647,
                        "src": "30472:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1643,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30472:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30457:32:0"
                  },
                  "returnParameters": {
                    "id": 1646,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30498:0:0"
                  },
                  "scope": 1655,
                  "src": "30443:56:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "e2bbb158",
                  "id": 1654,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1652,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1649,
                        "mutability": "mutable",
                        "name": "_pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1654,
                        "src": "30522:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1648,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30522:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1651,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1654,
                        "src": "30536:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1650,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "30536:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30521:31:0"
                  },
                  "returnParameters": {
                    "id": 1653,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30561:0:0"
                  },
                  "scope": 1655,
                  "src": "30505:57:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "30320:245:0"
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1656,
                    "name": "ITattooRewarder",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1619,
                    "src": "30598:15:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ITattooRewarder_$1619",
                      "typeString": "contract ITattooRewarder"
                    }
                  },
                  "id": 1657,
                  "nodeType": "InheritanceSpecifier",
                  "src": "30598:15:0"
                }
              ],
              "contractDependencies": [
                1619
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 2972,
              "linearizedBaseContracts": [
                2972,
                1619
              ],
              "name": "ConvexRewarder",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1660,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1658,
                    "name": "SafeERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1586,
                    "src": "30626:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20_$1586",
                      "typeString": "library SafeERC20"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "30620:27:0",
                  "typeName": {
                    "contractScope": null,
                    "id": 1659,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 728,
                    "src": "30640:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$728",
                      "typeString": "contract IERC20"
                    }
                  }
                },
                {
                  "id": 1663,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1661,
                    "name": "SafeMath",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1082,
                    "src": "30659:8:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMath_$1082",
                      "typeString": "library SafeMath"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "30653:27:0",
                  "typeName": {
                    "id": 1662,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30672:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "constant": false,
                  "functionSelector": "f7c618c1",
                  "id": 1665,
                  "mutability": "immutable",
                  "name": "rewardToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30688:35:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$728",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1664,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 728,
                    "src": "30688:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$728",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "72f702f3",
                  "id": 1667,
                  "mutability": "immutable",
                  "name": "stakingToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30730:36:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$728",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 1666,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 728,
                    "src": "30730:6:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$728",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "functionSelector": "0fb5a6b4",
                  "id": 1670,
                  "mutability": "constant",
                  "name": "duration",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30773:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1668,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30773:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "35",
                    "id": 1669,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "30808:6:0",
                    "subdenomination": "days",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_432000_by_1",
                      "typeString": "int_const 432000"
                    },
                    "value": "5"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "0f4ef8a6",
                  "id": 1672,
                  "mutability": "immutable",
                  "name": "rewardManager",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30823:38:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1671,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30823:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "395596dd",
                  "id": 1674,
                  "mutability": "immutable",
                  "name": "tattooMasterChef",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30868:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1673,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30868:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "e0d68925",
                  "id": 1676,
                  "mutability": "immutable",
                  "name": "convexMasterChef",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30916:41:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 1675,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30916:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "91817d74",
                  "id": 1678,
                  "mutability": "immutable",
                  "name": "chefPid",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "30964:32:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1677,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30964:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "ebe2b12b",
                  "id": 1681,
                  "mutability": "mutable",
                  "name": "periodFinish",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31005:31:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1679,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31005:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 1680,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "31035:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "7b0a47ee",
                  "id": 1684,
                  "mutability": "mutable",
                  "name": "rewardRate",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31043:29:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1682,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31043:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 1683,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "31071:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "c8f33c91",
                  "id": 1686,
                  "mutability": "mutable",
                  "name": "lastUpdateTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31079:29:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1685,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31079:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "df136d65",
                  "id": 1688,
                  "mutability": "mutable",
                  "name": "rewardPerTokenStored",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31115:35:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1687,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31115:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "901a7d53",
                  "id": 1691,
                  "mutability": "mutable",
                  "name": "currentRewards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31157:33:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1689,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31157:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 1690,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "31189:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 1693,
                  "mutability": "mutable",
                  "name": "_totalSupply",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31197:28:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1692,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31197:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "functionSelector": "2ae63c5b",
                  "id": 1695,
                  "mutability": "mutable",
                  "name": "tattooPid",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31232:24:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1694,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31232:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "46c65276",
                  "id": 1698,
                  "mutability": "mutable",
                  "name": "previousRewardDebt",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31263:37:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1696,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31263:7:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30",
                    "id": 1697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "31299:1:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_0_by_1",
                      "typeString": "int_const 0"
                    },
                    "value": "0"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "b145a5b8",
                  "id": 1701,
                  "mutability": "mutable",
                  "name": "isInit",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31307:26:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1699,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "31307:4:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "66616c7365",
                    "id": 1700,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "31328:5:0",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "false"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 1705,
                  "mutability": "mutable",
                  "name": "_balances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31342:45:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1704,
                    "keyType": {
                      "id": 1702,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31350:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31342:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1703,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31361:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1709,
                  "mutability": "mutable",
                  "name": "_tattooBalances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31394:51:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1708,
                    "keyType": {
                      "id": 1706,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31402:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31394:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1707,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31413:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "functionSelector": "8b876347",
                  "id": 1713,
                  "mutability": "mutable",
                  "name": "userRewardPerTokenPaid",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31452:57:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1712,
                    "keyType": {
                      "id": 1710,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31460:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31452:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1711,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31471:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "0700037d",
                  "id": 1717,
                  "mutability": "mutable",
                  "name": "rewards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31516:42:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1716,
                    "keyType": {
                      "id": 1714,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31524:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "31516:27:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1715,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "31535:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "40c35446",
                  "id": 1720,
                  "mutability": "mutable",
                  "name": "extraRewards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2972,
                  "src": "31567:29:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_storage",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1718,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "31567:7:0",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 1719,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "31567:9:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1724,
                  "name": "RewardAdded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1723,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1722,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "reward",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1724,
                        "src": "31623:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1721,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31623:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31622:16:0"
                  },
                  "src": "31605:34:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1730,
                  "name": "Staked",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1729,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1726,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1730,
                        "src": "31658:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1725,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31658:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1728,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1730,
                        "src": "31680:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1727,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31680:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31657:38:0"
                  },
                  "src": "31645:51:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1736,
                  "name": "Withdrawn",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1735,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1732,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1736,
                        "src": "31718:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1731,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31718:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1734,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1736,
                        "src": "31740:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1733,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31740:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31717:38:0"
                  },
                  "src": "31702:54:0"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 1742,
                  "name": "RewardPaid",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1741,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1738,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "31779:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1737,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31779:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1740,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "reward",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1742,
                        "src": "31801:14:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1739,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31801:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31778:38:0"
                  },
                  "src": "31762:55:0"
                },
                {
                  "body": {
                    "id": 1785,
                    "nodeType": "Block",
                    "src": "32046:264:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1761,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1757,
                            "name": "stakingToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1667,
                            "src": "32057:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1759,
                                "name": "stakingToken_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1744,
                                "src": "32079:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 1758,
                              "name": "IERC20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 728,
                              "src": "32072:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IERC20_$728_$",
                                "typeString": "type(contract IERC20)"
                              }
                            },
                            "id": 1760,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32072:21:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "32057:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 1762,
                        "nodeType": "ExpressionStatement",
                        "src": "32057:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1767,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1763,
                            "name": "rewardToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1665,
                            "src": "32104:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1765,
                                "name": "rewardToken_",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1746,
                                "src": "32125:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 1764,
                              "name": "IERC20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 728,
                              "src": "32118:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IERC20_$728_$",
                                "typeString": "type(contract IERC20)"
                              }
                            },
                            "id": 1766,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "32118:20:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "32104:34:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 1768,
                        "nodeType": "ExpressionStatement",
                        "src": "32104:34:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1771,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1769,
                            "name": "rewardManager",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1672,
                            "src": "32149:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1770,
                            "name": "rewardManager_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1748,
                            "src": "32165:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "32149:30:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1772,
                        "nodeType": "ExpressionStatement",
                        "src": "32149:30:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1775,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1773,
                            "name": "tattooMasterChef",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1674,
                            "src": "32190:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1774,
                            "name": "tattooMasterChef_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1750,
                            "src": "32209:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "32190:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1776,
                        "nodeType": "ExpressionStatement",
                        "src": "32190:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1777,
                            "name": "convexMasterChef",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1676,
                            "src": "32237:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1778,
                            "name": "convexMasterChef_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1752,
                            "src": "32256:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "32237:36:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 1780,
                        "nodeType": "ExpressionStatement",
                        "src": "32237:36:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1781,
                            "name": "chefPid",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1678,
                            "src": "32284:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1782,
                            "name": "chefPid_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1754,
                            "src": "32294:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32284:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1784,
                        "nodeType": "ExpressionStatement",
                        "src": "32284:18:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1786,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1755,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1744,
                        "mutability": "mutable",
                        "name": "stakingToken_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "31847:21:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1743,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31847:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1746,
                        "mutability": "mutable",
                        "name": "rewardToken_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "31879:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1745,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31879:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1748,
                        "mutability": "mutable",
                        "name": "rewardManager_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "31910:22:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1747,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31910:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1750,
                        "mutability": "mutable",
                        "name": "tattooMasterChef_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "31943:25:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1749,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31943:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1752,
                        "mutability": "mutable",
                        "name": "convexMasterChef_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "31979:25:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1751,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31979:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1754,
                        "mutability": "mutable",
                        "name": "chefPid_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1786,
                        "src": "32015:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1753,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32015:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31836:202:0"
                  },
                  "returnParameters": {
                    "id": 1756,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32046:0:0"
                  },
                  "scope": 2972,
                  "src": "31825:485:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1846,
                    "nodeType": "Block",
                    "src": "32470:412:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1793,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "!",
                              "prefix": true,
                              "src": "32489:7:0",
                              "subExpression": {
                                "argumentTypes": null,
                                "id": 1792,
                                "name": "isInit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1701,
                                "src": "32490:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "616c726561647920696e6974",
                              "id": 1794,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "32497:14:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_72dfc290c8a7a87f2000a2b5ff3f7a4979cc11f1d3339075c1d4bb07337dbe1e",
                                "typeString": "literal_string \"already init\""
                              },
                              "value": "already init"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_72dfc290c8a7a87f2000a2b5ff3f7a4979cc11f1d3339075c1d4bb07337dbe1e",
                                "typeString": "literal_string \"already init\""
                              }
                            ],
                            "id": 1791,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "32481:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1795,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32481:31:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1796,
                        "nodeType": "ExpressionStatement",
                        "src": "32481:31:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1799,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1797,
                            "name": "isInit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1701,
                            "src": "32523:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "74727565",
                            "id": 1798,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "32532:4:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "true"
                          },
                          "src": "32523:13:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1800,
                        "nodeType": "ExpressionStatement",
                        "src": "32523:13:0"
                      },
                      {
                        "assignments": [
                          1802
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1802,
                            "mutability": "mutable",
                            "name": "balance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1846,
                            "src": "32547:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1801,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "32547:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1808,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1805,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "32586:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1806,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "32586:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1803,
                              "name": "dummyToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1788,
                              "src": "32565:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1804,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 667,
                            "src": "32565:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 1807,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32565:32:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "32547:50:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1812,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1810,
                                "name": "balance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1802,
                                "src": "32616:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1811,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "32627:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "32616:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "42616c616e6365206d757374206578636565642030",
                              "id": 1813,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "32630:23:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2b838860d699c47ba608155cae8e0b922267380a0c086049df111458f89a4642",
                                "typeString": "literal_string \"Balance must exceed 0\""
                              },
                              "value": "Balance must exceed 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2b838860d699c47ba608155cae8e0b922267380a0c086049df111458f89a4642",
                                "typeString": "literal_string \"Balance must exceed 0\""
                              }
                            ],
                            "id": 1809,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "32608:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1814,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32608:46:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1815,
                        "nodeType": "ExpressionStatement",
                        "src": "32608:46:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 1819,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "32693:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 1820,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "32693:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1823,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "32713:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 1822,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "32705:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1821,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "32705:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1824,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32705:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1825,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1802,
                              "src": "32720:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1816,
                              "name": "dummyToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1788,
                              "src": "32665:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1818,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1432,
                            "src": "32665:27:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$728_$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 1826,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32665:63:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1827,
                        "nodeType": "ExpressionStatement",
                        "src": "32665:63:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1831,
                              "name": "convexMasterChef",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1676,
                              "src": "32758:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1832,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1802,
                              "src": "32776:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1828,
                              "name": "dummyToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1788,
                              "src": "32739:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 1830,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "approve",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 697,
                            "src": "32739:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 1833,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32739:45:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 1834,
                        "nodeType": "ExpressionStatement",
                        "src": "32739:45:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1839,
                              "name": "chefPid",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1678,
                              "src": "32833:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1840,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1802,
                              "src": "32842:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1836,
                                  "name": "convexMasterChef",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1676,
                                  "src": "32807:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1835,
                                "name": "IConvexChef",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1655,
                                "src": "32795:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IConvexChef_$1655_$",
                                  "typeString": "type(contract IConvexChef)"
                                }
                              },
                              "id": 1837,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32795:29:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IConvexChef_$1655",
                                "typeString": "contract IConvexChef"
                              }
                            },
                            "id": 1838,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "deposit",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1654,
                            "src": "32795:37:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (uint256,uint256) external"
                            }
                          },
                          "id": 1841,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32795:55:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1842,
                        "nodeType": "ExpressionStatement",
                        "src": "32795:55:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1843,
                            "name": "initRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2565,
                            "src": "32861:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 1844,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32861:13:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1845,
                        "nodeType": "ExpressionStatement",
                        "src": "32861:13:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "19ab453c",
                  "id": 1847,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1789,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1788,
                        "mutability": "mutable",
                        "name": "dummyToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1847,
                        "src": "32442:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$728",
                          "typeString": "contract IERC20"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1787,
                          "name": "IERC20",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 728,
                          "src": "32442:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32441:19:0"
                  },
                  "returnParameters": {
                    "id": 1790,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32470:0:0"
                  },
                  "scope": 2972,
                  "src": "32428:454:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 1864,
                    "nodeType": "Block",
                    "src": "32986:109:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1854,
                              "name": "chefPid",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1678,
                              "src": "33033:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1857,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "33050:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 1856,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "33042:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1855,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "33042:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1858,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33042:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1851,
                                  "name": "convexMasterChef",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1676,
                                  "src": "33009:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 1850,
                                "name": "IConvexChef",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1655,
                                "src": "32997:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IConvexChef_$1655_$",
                                  "typeString": "type(contract IConvexChef)"
                                }
                              },
                              "id": 1852,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32997:29:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IConvexChef_$1655",
                                "typeString": "contract IConvexChef"
                              }
                            },
                            "id": 1853,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "claim",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1647,
                            "src": "32997:35:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (uint256,address) external"
                            }
                          },
                          "id": 1859,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32997:59:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1860,
                        "nodeType": "ExpressionStatement",
                        "src": "32997:59:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1861,
                            "name": "notifyRewardAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2673,
                            "src": "33067:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 1862,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33067:20:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1863,
                        "nodeType": "ExpressionStatement",
                        "src": "33067:20:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4f70b15a",
                  "id": 1865,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "harvestFromMasterChef",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1848,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32976:2:0"
                  },
                  "returnParameters": {
                    "id": 1849,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32986:0:0"
                  },
                  "scope": 2972,
                  "src": "32946:149:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1872,
                    "nodeType": "Block",
                    "src": "33156:38:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1870,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1693,
                          "src": "33174:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1869,
                        "id": 1871,
                        "nodeType": "Return",
                        "src": "33167:19:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 1873,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1866,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33123:2:0"
                  },
                  "returnParameters": {
                    "id": 1869,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1868,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1873,
                        "src": "33147:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1867,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33147:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33146:9:0"
                  },
                  "scope": 2972,
                  "src": "33103:91:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1889,
                    "nodeType": "Block",
                    "src": "33268:74:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1884,
                                "name": "_tattooBalances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1709,
                                "src": "33309:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                  "typeString": "mapping(address => uint256)"
                                }
                              },
                              "id": 1886,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1885,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1875,
                                "src": "33325:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "33309:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1880,
                                "name": "_balances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1705,
                                "src": "33286:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                  "typeString": "mapping(address => uint256)"
                                }
                              },
                              "id": 1882,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1881,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1875,
                                "src": "33296:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "33286:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 1883,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 909,
                            "src": "33286:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 1887,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33286:48:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1879,
                        "id": 1888,
                        "nodeType": "Return",
                        "src": "33279:55:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 1890,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1876,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1875,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1890,
                        "src": "33221:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1874,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33221:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33220:17:0"
                  },
                  "returnParameters": {
                    "id": 1879,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1878,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1890,
                        "src": "33259:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1877,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33259:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33258:9:0"
                  },
                  "scope": 2972,
                  "src": "33202:140:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1901,
                    "nodeType": "Block",
                    "src": "33421:44:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1897,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1705,
                            "src": "33439:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1899,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1898,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1892,
                            "src": "33449:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "33439:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1896,
                        "id": 1900,
                        "nodeType": "Return",
                        "src": "33432:25:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "6762805c",
                  "id": 1902,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "localBalanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1893,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1892,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1902,
                        "src": "33374:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1891,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33374:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33373:17:0"
                  },
                  "returnParameters": {
                    "id": 1896,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1895,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1902,
                        "src": "33412:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1894,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33412:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33411:9:0"
                  },
                  "scope": 2972,
                  "src": "33350:115:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1913,
                    "nodeType": "Block",
                    "src": "33545:50:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1909,
                            "name": "_tattooBalances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1709,
                            "src": "33563:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1911,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1910,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1904,
                            "src": "33579:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "33563:24:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1908,
                        "id": 1912,
                        "nodeType": "Return",
                        "src": "33556:31:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "473be90e",
                  "id": 1914,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tattooBalanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1905,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1904,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1914,
                        "src": "33498:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1903,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33498:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33497:17:0"
                  },
                  "returnParameters": {
                    "id": 1908,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1907,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1914,
                        "src": "33536:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1906,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33536:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33535:9:0"
                  },
                  "scope": 2972,
                  "src": "33473:122:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1922,
                    "nodeType": "Block",
                    "src": "33665:45:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 1919,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "33683:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 1920,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "33683:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1918,
                        "id": 1921,
                        "nodeType": "Return",
                        "src": "33676:26:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "d55a23f4",
                  "id": 1923,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "extraRewardsLength",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1915,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33630:2:0"
                  },
                  "returnParameters": {
                    "id": 1918,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1917,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1923,
                        "src": "33656:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1916,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33656:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33655:9:0"
                  },
                  "scope": 2972,
                  "src": "33603:107:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 1952,
                    "nodeType": "Block",
                    "src": "33768:168:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1932,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1929,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "33787:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1930,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33787:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1931,
                                "name": "rewardManager",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1672,
                                "src": "33801:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "33787:27:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "21617574686f72697a6564",
                              "id": 1933,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "33816:13:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                                "typeString": "literal_string \"!authorized\""
                              },
                              "value": "!authorized"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                                "typeString": "literal_string \"!authorized\""
                              }
                            ],
                            "id": 1928,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "33779:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1934,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33779:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1935,
                        "nodeType": "ExpressionStatement",
                        "src": "33779:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1942,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1937,
                                "name": "_reward",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1925,
                                "src": "33849:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1940,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "33868:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1939,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "33860:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1938,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "33860:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1941,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "33860:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "33849:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "217265776172642073657474696e67",
                              "id": 1943,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "33871:17:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_858e46e0e9ba8ebaaa499ce77d3f78d179ce723da6012aa81625e2c24d59a111",
                                "typeString": "literal_string \"!reward setting\""
                              },
                              "value": "!reward setting"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_858e46e0e9ba8ebaaa499ce77d3f78d179ce723da6012aa81625e2c24d59a111",
                                "typeString": "literal_string \"!reward setting\""
                              }
                            ],
                            "id": 1936,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "33841:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1944,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33841:48:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1945,
                        "nodeType": "ExpressionStatement",
                        "src": "33841:48:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1949,
                              "name": "_reward",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1925,
                              "src": "33920:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 1946,
                              "name": "extraRewards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1720,
                              "src": "33902:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                "typeString": "address[] storage ref"
                              }
                            },
                            "id": 1948,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "33902:17:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 1950,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33902:26:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1951,
                        "nodeType": "ExpressionStatement",
                        "src": "33902:26:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "5e43c47b",
                  "id": 1953,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addExtraReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1926,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1925,
                        "mutability": "mutable",
                        "name": "_reward",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1953,
                        "src": "33742:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1924,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33742:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33741:17:0"
                  },
                  "returnParameters": {
                    "id": 1927,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33768:0:0"
                  },
                  "scope": 2972,
                  "src": "33718:218:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 1967,
                    "nodeType": "Block",
                    "src": "33979:100:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1957,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "33998:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 1958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33998:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1959,
                                "name": "rewardManager",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1672,
                                "src": "34012:13:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "33998:27:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "21617574686f72697a6564",
                              "id": 1961,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "34027:13:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                                "typeString": "literal_string \"!authorized\""
                              },
                              "value": "!authorized"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d7031b85265729c6983ea6d4e363a4efb2dd08bdad971b2517bc786f89231cb6",
                                "typeString": "literal_string \"!authorized\""
                              }
                            ],
                            "id": 1956,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "33990:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1962,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33990:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1963,
                        "nodeType": "ExpressionStatement",
                        "src": "33990:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1965,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "34052:19:0",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 1964,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "34059:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1966,
                        "nodeType": "ExpressionStatement",
                        "src": "34052:19:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "0569d388",
                  "id": 1968,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "clearExtraRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1954,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33968:2:0"
                  },
                  "returnParameters": {
                    "id": 1955,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33979:0:0"
                  },
                  "scope": 2972,
                  "src": "33942:137:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2005,
                    "nodeType": "Block",
                    "src": "34126:291:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1975,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1972,
                            "name": "rewardPerTokenStored",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1688,
                            "src": "34137:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 1973,
                              "name": "rewardPerToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2055,
                              "src": "34160:14:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 1974,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "34160:16:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "34137:39:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1976,
                        "nodeType": "ExpressionStatement",
                        "src": "34137:39:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1980,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1977,
                            "name": "lastUpdateTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1686,
                            "src": "34187:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 1978,
                              "name": "lastTimeRewardApplicable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2019,
                              "src": "34204:24:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 1979,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "34204:26:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "34187:43:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1981,
                        "nodeType": "ExpressionStatement",
                        "src": "34187:43:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 1987,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1982,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1970,
                            "src": "34245:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1985,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "34264:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 1984,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "34256:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 1983,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "34256:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 1986,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "34256:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "34245:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2003,
                        "nodeType": "IfStatement",
                        "src": "34241:157:0",
                        "trueBody": {
                          "id": 2002,
                          "nodeType": "Block",
                          "src": "34268:130:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1994,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1988,
                                    "name": "rewards",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1717,
                                    "src": "34283:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 1990,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1989,
                                    "name": "account",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1970,
                                    "src": "34291:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "34283:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 1992,
                                      "name": "account",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1970,
                                      "src": "34309:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 1991,
                                    "name": "earned",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2089,
                                    "src": "34302:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                      "typeString": "function (address) view returns (uint256)"
                                    }
                                  },
                                  "id": 1993,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34302:15:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34283:34:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1995,
                              "nodeType": "ExpressionStatement",
                              "src": "34283:34:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2000,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 1996,
                                    "name": "userRewardPerTokenPaid",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1713,
                                    "src": "34332:22:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 1998,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1997,
                                    "name": "account",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1970,
                                    "src": "34355:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "34332:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 1999,
                                  "name": "rewardPerTokenStored",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1688,
                                  "src": "34366:20:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34332:54:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2001,
                              "nodeType": "ExpressionStatement",
                              "src": "34332:54:0"
                            }
                          ]
                        }
                      },
                      {
                        "id": 2004,
                        "nodeType": "PlaceholderStatement",
                        "src": "34408:1:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2006,
                  "name": "updateReward",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1971,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1970,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2006,
                        "src": "34109:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1969,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "34109:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34108:17:0"
                  },
                  "src": "34087:330:0",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2018,
                    "nodeType": "Block",
                    "src": "34491:69:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2013,
                                "name": "block",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -4,
                                "src": "34522:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_block",
                                  "typeString": "block"
                                }
                              },
                              "id": 2014,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "timestamp",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "34522:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2015,
                              "name": "periodFinish",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1681,
                              "src": "34539:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2011,
                              "name": "MathUtil",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 21,
                              "src": "34509:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_MathUtil_$21_$",
                                "typeString": "type(library MathUtil)"
                              }
                            },
                            "id": 2012,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "min",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 20,
                            "src": "34509:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34509:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2010,
                        "id": 2017,
                        "nodeType": "Return",
                        "src": "34502:50:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "80faa57d",
                  "id": 2019,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "lastTimeRewardApplicable",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2007,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34458:2:0"
                  },
                  "returnParameters": {
                    "id": 2010,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2009,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2019,
                        "src": "34482:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2008,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "34482:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34481:9:0"
                  },
                  "scope": 2972,
                  "src": "34425:135:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2054,
                    "nodeType": "Block",
                    "src": "34624:347:0",
                    "statements": [
                      {
                        "assignments": [
                          2025
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2025,
                            "mutability": "mutable",
                            "name": "supply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2054,
                            "src": "34635:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2024,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "34635:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2028,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2026,
                            "name": "totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1873,
                            "src": "34652:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 2027,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34652:13:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "34635:30:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2031,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2029,
                            "name": "supply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2025,
                            "src": "34680:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2030,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "34690:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "34680:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2035,
                        "nodeType": "IfStatement",
                        "src": "34676:71:0",
                        "trueBody": {
                          "id": 2034,
                          "nodeType": "Block",
                          "src": "34693:54:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2032,
                                "name": "rewardPerTokenStored",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1688,
                                "src": "34715:20:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 2023,
                              "id": 2033,
                              "nodeType": "Return",
                              "src": "34708:27:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2050,
                                  "name": "supply",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2025,
                                  "src": "34945:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "31653138",
                                      "id": 2047,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "34921:4:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                        "typeString": "int_const 1000000000000000000"
                                      },
                                      "value": "1e18"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                        "typeString": "int_const 1000000000000000000"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2044,
                                          "name": "rewardRate",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1684,
                                          "src": "34891:10:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2041,
                                              "name": "lastUpdateTime",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 1686,
                                              "src": "34857:14:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "arguments": [],
                                              "expression": {
                                                "argumentTypes": [],
                                                "id": 2038,
                                                "name": "lastTimeRewardApplicable",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2019,
                                                "src": "34812:24:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                                  "typeString": "function () view returns (uint256)"
                                                }
                                              },
                                              "id": 2039,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "34812:26:0",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 2040,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sub",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 931,
                                            "src": "34812:44:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                                            }
                                          },
                                          "id": 2042,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "34812:60:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2043,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "mul",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 965,
                                        "src": "34812:78:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 2045,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "34812:90:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2046,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 965,
                                    "src": "34812:108:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2048,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "34812:114:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2049,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "div",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 987,
                                "src": "34812:132:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 2051,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34812:140:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2036,
                              "name": "rewardPerTokenStored",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1688,
                              "src": "34773:20:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2037,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 909,
                            "src": "34773:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2052,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34773:190:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2023,
                        "id": 2053,
                        "nodeType": "Return",
                        "src": "34757:206:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "cd3daf9d",
                  "id": 2055,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "rewardPerToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2020,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34591:2:0"
                  },
                  "returnParameters": {
                    "id": 2023,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2022,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2055,
                        "src": "34615:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2021,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "34615:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34614:9:0"
                  },
                  "scope": 2972,
                  "src": "34568:403:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2088,
                    "nodeType": "Block",
                    "src": "35042:204:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2083,
                                "name": "rewards",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1717,
                                "src": "35221:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                  "typeString": "mapping(address => uint256)"
                                }
                              },
                              "id": 2085,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2084,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2057,
                                "src": "35229:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "35221:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "31653138",
                                  "id": 2080,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35201:4:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                    "typeString": "int_const 1000000000000000000"
                                  },
                                  "value": "1e18"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                    "typeString": "int_const 1000000000000000000"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2074,
                                            "name": "userRewardPerTokenPaid",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1713,
                                            "src": "35153:22:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                              "typeString": "mapping(address => uint256)"
                                            }
                                          },
                                          "id": 2076,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2075,
                                            "name": "account",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2057,
                                            "src": "35176:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "35153:31:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [],
                                          "expression": {
                                            "argumentTypes": [],
                                            "id": 2071,
                                            "name": "rewardPerToken",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2055,
                                            "src": "35132:14:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                              "typeString": "function () view returns (uint256)"
                                            }
                                          },
                                          "id": 2072,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "35132:16:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2073,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 931,
                                        "src": "35132:20:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 2077,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "35132:53:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2066,
                                            "name": "_tattooBalances",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1709,
                                            "src": "35092:15:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                              "typeString": "mapping(address => uint256)"
                                            }
                                          },
                                          "id": 2068,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2067,
                                            "name": "account",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2057,
                                            "src": "35108:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "35092:24:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2062,
                                            "name": "_balances",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1705,
                                            "src": "35069:9:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                              "typeString": "mapping(address => uint256)"
                                            }
                                          },
                                          "id": 2064,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2063,
                                            "name": "account",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2057,
                                            "src": "35079:7:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "35069:18:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 2065,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "add",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 909,
                                        "src": "35069:22:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 2069,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "35069:48:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2070,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 965,
                                    "src": "35069:62:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2078,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "35069:117:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2079,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "div",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 987,
                                "src": "35069:131:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 2081,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35069:137:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2082,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 909,
                            "src": "35069:151:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35069:169:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2061,
                        "id": 2087,
                        "nodeType": "Return",
                        "src": "35053:185:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "008cc262",
                  "id": 2089,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "earned",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2058,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2057,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2089,
                        "src": "34995:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2056,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "34995:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34994:17:0"
                  },
                  "returnParameters": {
                    "id": 2061,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2060,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2089,
                        "src": "35033:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2059,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35033:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35032:9:0"
                  },
                  "scope": 2972,
                  "src": "34979:267:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2174,
                    "nodeType": "Block",
                    "src": "35333:710:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2101,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2099,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2091,
                                "src": "35352:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2100,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "35362:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "35352:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "526577617264506f6f6c203a2043616e6e6f74207374616b652030",
                              "id": 2102,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35365:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d826a79e4f06af8ebe38a5df3fb5ee23af1b3b75e31b3c3d43a226eaf5927a33",
                                "typeString": "literal_string \"RewardPool : Cannot stake 0\""
                              },
                              "value": "RewardPool : Cannot stake 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d826a79e4f06af8ebe38a5df3fb5ee23af1b3b75e31b3c3d43a226eaf5927a33",
                                "typeString": "literal_string \"RewardPool : Cannot stake 0\""
                              }
                            ],
                            "id": 2098,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35344:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2103,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35344:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2104,
                        "nodeType": "ExpressionStatement",
                        "src": "35344:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2105,
                            "name": "checkHarvest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2481,
                            "src": "35474:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35474:14:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2107,
                        "nodeType": "ExpressionStatement",
                        "src": "35474:14:0"
                      },
                      {
                        "assignments": [
                          2109
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2109,
                            "mutability": "mutable",
                            "name": "length",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2174,
                            "src": "35541:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2108,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "35541:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2112,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2110,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "35558:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 2111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "35558:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "35541:36:0"
                      },
                      {
                        "body": {
                          "id": 2134,
                          "nodeType": "Block",
                          "src": "35618:79:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2129,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "35665:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2130,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "35665:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2131,
                                    "name": "_amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2091,
                                    "src": "35677:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 2124,
                                          "name": "extraRewards",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1720,
                                          "src": "35642:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                            "typeString": "address[] storage ref"
                                          }
                                        },
                                        "id": 2126,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 2125,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2114,
                                          "src": "35655:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "35642:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2123,
                                      "name": "IRewards",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 384,
                                      "src": "35633:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                        "typeString": "type(contract IRewards)"
                                      }
                                    },
                                    "id": 2127,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "35633:25:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IRewards_$384",
                                      "typeString": "contract IRewards"
                                    }
                                  },
                                  "id": 2128,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "stake",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 327,
                                  "src": "35633:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint256) external"
                                  }
                                },
                                "id": 2132,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "35633:52:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2133,
                              "nodeType": "ExpressionStatement",
                              "src": "35633:52:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2119,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2117,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2114,
                            "src": "35602:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2118,
                            "name": "length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2109,
                            "src": "35606:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "35602:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2135,
                        "initializationExpression": {
                          "assignments": [
                            2114
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2114,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2135,
                              "src": "35592:6:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2113,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "35592:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2116,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2115,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "35599:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "35592:8:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2121,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "35614:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2120,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2114,
                              "src": "35614:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2122,
                          "nodeType": "ExpressionStatement",
                          "src": "35614:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "35588:109:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2141,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2136,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1693,
                            "src": "35731:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2139,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2091,
                                "src": "35763:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2137,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1693,
                                "src": "35746:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2138,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "35746:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2140,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35746:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "35731:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2142,
                        "nodeType": "ExpressionStatement",
                        "src": "35731:40:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2143,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "35821:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2146,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2144,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "35831:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2145,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "35831:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "35821:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2152,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2091,
                                "src": "35871:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2147,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1705,
                                  "src": "35845:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2150,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2148,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "35855:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 2149,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "35855:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "35845:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2151,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "35845:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2153,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "35845:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "35821:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2155,
                        "nodeType": "ExpressionStatement",
                        "src": "35821:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2159,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "35955:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2160,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "35955:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2163,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "35975:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 2162,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "35967:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2161,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "35967:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2164,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35967:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2165,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2091,
                              "src": "35982:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2156,
                              "name": "stakingToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1667,
                              "src": "35925:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2158,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1432,
                            "src": "35925:29:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$728_$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 2166,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35925:65:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2167,
                        "nodeType": "ExpressionStatement",
                        "src": "35925:65:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2169,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "36015:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2170,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "36015:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2171,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2091,
                              "src": "36027:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2168,
                            "name": "Staked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1730,
                            "src": "36008:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2172,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36008:27:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2173,
                        "nodeType": "EmitStatement",
                        "src": "36003:32:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "a694fc3a",
                  "id": 2175,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2094,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "35316:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 2095,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "35316:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "id": 2096,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2093,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "35303:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "35303:24:0"
                    }
                  ],
                  "name": "stake",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2092,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2091,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2175,
                        "src": "35269:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2090,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35269:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35268:17:0"
                  },
                  "returnParameters": {
                    "id": 2097,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35333:0:0"
                  },
                  "scope": 2972,
                  "src": "35254:789:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2190,
                    "nodeType": "Block",
                    "src": "36079:96:0",
                    "statements": [
                      {
                        "assignments": [
                          2179
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2179,
                            "mutability": "mutable",
                            "name": "balance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2190,
                            "src": "36090:15:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2178,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36090:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2185,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2182,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "36131:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "36131:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2180,
                              "name": "stakingToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1667,
                              "src": "36108:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2181,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 667,
                            "src": "36108:22:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 2184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36108:34:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36090:52:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2187,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2179,
                              "src": "36159:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2186,
                            "name": "stake",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2175,
                            "src": "36153:5:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 2188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36153:14:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2189,
                        "nodeType": "ExpressionStatement",
                        "src": "36153:14:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8dcb4061",
                  "id": 2191,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stakeAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2176,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36068:2:0"
                  },
                  "returnParameters": {
                    "id": 2177,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36079:0:0"
                  },
                  "scope": 2972,
                  "src": "36051:124:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2274,
                    "nodeType": "Block",
                    "src": "36273:692:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2202,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2195,
                                "src": "36292:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2203,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "36302:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "36292:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "526577617264506f6f6c203a2043616e6e6f74207374616b652030",
                              "id": 2205,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "36305:29:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d826a79e4f06af8ebe38a5df3fb5ee23af1b3b75e31b3c3d43a226eaf5927a33",
                                "typeString": "literal_string \"RewardPool : Cannot stake 0\""
                              },
                              "value": "RewardPool : Cannot stake 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d826a79e4f06af8ebe38a5df3fb5ee23af1b3b75e31b3c3d43a226eaf5927a33",
                                "typeString": "literal_string \"RewardPool : Cannot stake 0\""
                              }
                            ],
                            "id": 2201,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "36284:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2206,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36284:51:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2207,
                        "nodeType": "ExpressionStatement",
                        "src": "36284:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2208,
                            "name": "checkHarvest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2481,
                            "src": "36414:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2209,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36414:14:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2210,
                        "nodeType": "ExpressionStatement",
                        "src": "36414:14:0"
                      },
                      {
                        "assignments": [
                          2212
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2212,
                            "mutability": "mutable",
                            "name": "length",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2274,
                            "src": "36481:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2211,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "36481:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2215,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2213,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "36498:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 2214,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "36498:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36481:36:0"
                      },
                      {
                        "body": {
                          "id": 2236,
                          "nodeType": "Block",
                          "src": "36558:73:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2232,
                                    "name": "_for",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2193,
                                    "src": "36605:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2233,
                                    "name": "_amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2195,
                                    "src": "36611:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 2227,
                                          "name": "extraRewards",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1720,
                                          "src": "36582:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                            "typeString": "address[] storage ref"
                                          }
                                        },
                                        "id": 2229,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 2228,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2217,
                                          "src": "36595:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "36582:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2226,
                                      "name": "IRewards",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 384,
                                      "src": "36573:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                        "typeString": "type(contract IRewards)"
                                      }
                                    },
                                    "id": 2230,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "36573:25:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IRewards_$384",
                                      "typeString": "contract IRewards"
                                    }
                                  },
                                  "id": 2231,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "stake",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 327,
                                  "src": "36573:31:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint256) external"
                                  }
                                },
                                "id": 2234,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36573:46:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2235,
                              "nodeType": "ExpressionStatement",
                              "src": "36573:46:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2222,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2220,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2217,
                            "src": "36542:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2221,
                            "name": "length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2212,
                            "src": "36546:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36542:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2237,
                        "initializationExpression": {
                          "assignments": [
                            2217
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2217,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2237,
                              "src": "36532:6:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2216,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "36532:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2219,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2218,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "36539:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "36532:8:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2224,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "36554:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2223,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2217,
                              "src": "36554:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2225,
                          "nodeType": "ExpressionStatement",
                          "src": "36554:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "36528:103:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2243,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2238,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1693,
                            "src": "36665:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2241,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2195,
                                "src": "36697:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2239,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1693,
                                "src": "36680:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2240,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "36680:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2242,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "36680:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36665:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2244,
                        "nodeType": "ExpressionStatement",
                        "src": "36665:40:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2245,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "36755:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2247,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2246,
                              "name": "_for",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2193,
                              "src": "36765:4:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "36755:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2252,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2195,
                                "src": "36793:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2248,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1705,
                                  "src": "36773:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2250,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 2249,
                                  "name": "_for",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2193,
                                  "src": "36783:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "36773:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2251,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "36773:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2253,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "36773:28:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "36755:46:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2255,
                        "nodeType": "ExpressionStatement",
                        "src": "36755:46:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2259,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "36877:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2260,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "36877:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2263,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "36897:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 2262,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "36889:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2261,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "36889:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2264,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36889:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2265,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2195,
                              "src": "36904:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2256,
                              "name": "stakingToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1667,
                              "src": "36847:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2258,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1432,
                            "src": "36847:29:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$728_$",
                              "typeString": "function (contract IERC20,address,address,uint256)"
                            }
                          },
                          "id": 2266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36847:65:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2267,
                        "nodeType": "ExpressionStatement",
                        "src": "36847:65:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2269,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "36937:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2270,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "36937:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2271,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2195,
                              "src": "36949:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2268,
                            "name": "Staked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1730,
                            "src": "36930:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36930:27:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2273,
                        "nodeType": "EmitStatement",
                        "src": "36925:32:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "2ee40908",
                  "id": 2275,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2198,
                          "name": "_for",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2193,
                          "src": "36262:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2199,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2197,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "36249:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "36249:18:0"
                    }
                  ],
                  "name": "stakeFor",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2196,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2193,
                        "mutability": "mutable",
                        "name": "_for",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2275,
                        "src": "36201:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2192,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36201:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2195,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2275,
                        "src": "36215:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2194,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "36215:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36200:31:0"
                  },
                  "returnParameters": {
                    "id": 2200,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36273:0:0"
                  },
                  "scope": 2972,
                  "src": "36183:782:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2364,
                    "nodeType": "Block",
                    "src": "37067:588:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2289,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2287,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2277,
                                "src": "37086:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 2288,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "37096:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "37086:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "526577617264506f6f6c203a2043616e6e6f742077697468647261772030",
                              "id": 2290,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "37099:32:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_64aa37ddb31e154d007d0dfd471fd4c2da015058fa9c8808df90f0cc24eedff1",
                                "typeString": "literal_string \"RewardPool : Cannot withdraw 0\""
                              },
                              "value": "RewardPool : Cannot withdraw 0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_64aa37ddb31e154d007d0dfd471fd4c2da015058fa9c8808df90f0cc24eedff1",
                                "typeString": "literal_string \"RewardPool : Cannot withdraw 0\""
                              }
                            ],
                            "id": 2286,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "37078:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2291,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37078:54:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2292,
                        "nodeType": "ExpressionStatement",
                        "src": "37078:54:0"
                      },
                      {
                        "assignments": [
                          2294
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2294,
                            "mutability": "mutable",
                            "name": "length",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2364,
                            "src": "37190:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2293,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "37190:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2297,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2295,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "37207:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 2296,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "37207:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37190:36:0"
                      },
                      {
                        "body": {
                          "id": 2319,
                          "nodeType": "Block",
                          "src": "37267:82:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2314,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "37317:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2315,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "37317:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2316,
                                    "name": "_amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2277,
                                    "src": "37329:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 2309,
                                          "name": "extraRewards",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1720,
                                          "src": "37291:12:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                            "typeString": "address[] storage ref"
                                          }
                                        },
                                        "id": 2311,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 2310,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2299,
                                          "src": "37304:1:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "37291:15:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 2308,
                                      "name": "IRewards",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 384,
                                      "src": "37282:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                        "typeString": "type(contract IRewards)"
                                      }
                                    },
                                    "id": 2312,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "37282:25:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IRewards_$384",
                                      "typeString": "contract IRewards"
                                    }
                                  },
                                  "id": 2313,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "withdraw",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 341,
                                  "src": "37282:34:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint256) external"
                                  }
                                },
                                "id": 2317,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37282:55:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2318,
                              "nodeType": "ExpressionStatement",
                              "src": "37282:55:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2304,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2302,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2299,
                            "src": "37251:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2303,
                            "name": "length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2294,
                            "src": "37255:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37251:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2320,
                        "initializationExpression": {
                          "assignments": [
                            2299
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2299,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2320,
                              "src": "37241:6:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2298,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "37241:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2301,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2300,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "37248:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "37241:8:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2306,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "37263:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2305,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2299,
                              "src": "37263:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2307,
                          "nodeType": "ExpressionStatement",
                          "src": "37263:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "37237:112:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2326,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2321,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1693,
                            "src": "37361:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2324,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2277,
                                "src": "37393:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 2322,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1693,
                                "src": "37376:12:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2323,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 931,
                              "src": "37376:16:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2325,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37376:25:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37361:40:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2327,
                        "nodeType": "ExpressionStatement",
                        "src": "37361:40:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2339,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2328,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1705,
                              "src": "37412:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 2331,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2329,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "37422:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2330,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "37422:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "37412:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2337,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2277,
                                "src": "37462:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 2332,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1705,
                                  "src": "37436:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 2335,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2333,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "37446:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 2334,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "37446:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "37436:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2336,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 931,
                              "src": "37436:25:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2338,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "37436:34:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "37412:58:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2340,
                        "nodeType": "ExpressionStatement",
                        "src": "37412:58:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2344,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "37507:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2345,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "37507:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2346,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2277,
                              "src": "37519:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2341,
                              "name": "stakingToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1667,
                              "src": "37481:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2343,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1407,
                            "src": "37481:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$728_$",
                              "typeString": "function (contract IERC20,address,uint256)"
                            }
                          },
                          "id": 2347,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37481:46:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2348,
                        "nodeType": "ExpressionStatement",
                        "src": "37481:46:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2350,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "37553:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2351,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "37553:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2352,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2277,
                              "src": "37565:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2349,
                            "name": "Withdrawn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1736,
                            "src": "37543:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2353,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37543:30:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2354,
                        "nodeType": "EmitStatement",
                        "src": "37538:35:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2355,
                          "name": "claim",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2279,
                          "src": "37589:5:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2363,
                        "nodeType": "IfStatement",
                        "src": "37586:62:0",
                        "trueBody": {
                          "id": 2362,
                          "nodeType": "Block",
                          "src": "37595:53:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2357,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "37620:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 2358,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "37620:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "74727565",
                                    "id": 2359,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "bool",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "37631:4:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "value": "true"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 2356,
                                  "name": "getReward",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2451,
                                  "src": "37610:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$",
                                    "typeString": "function (address,bool)"
                                  }
                                },
                                "id": 2360,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37610:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2361,
                              "nodeType": "ExpressionStatement",
                              "src": "37610:26:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "38d07436",
                  "id": 2365,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2282,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "37050:3:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 2283,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "37050:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "id": 2284,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2281,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "37037:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "37037:24:0"
                    }
                  ],
                  "name": "withdraw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2280,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2277,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2365,
                        "src": "36991:15:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2276,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "36991:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2279,
                        "mutability": "mutable",
                        "name": "claim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2365,
                        "src": "37008:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2278,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "37008:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36990:29:0"
                  },
                  "returnParameters": {
                    "id": 2285,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37067:0:0"
                  },
                  "scope": 2972,
                  "src": "36973:682:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2378,
                    "nodeType": "Block",
                    "src": "37704:56:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2371,
                                "name": "_balances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1705,
                                "src": "37724:9:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                  "typeString": "mapping(address => uint256)"
                                }
                              },
                              "id": 2374,
                              "indexExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2372,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "37734:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2373,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37734:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "37724:21:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2375,
                              "name": "claim",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2367,
                              "src": "37746:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2370,
                            "name": "withdraw",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2365,
                            "src": "37715:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_bool_$returns$__$",
                              "typeString": "function (uint256,bool)"
                            }
                          },
                          "id": 2376,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37715:37:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2377,
                        "nodeType": "ExpressionStatement",
                        "src": "37715:37:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "1c1c6fe5",
                  "id": 2379,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2368,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2367,
                        "mutability": "mutable",
                        "name": "claim",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2379,
                        "src": "37684:10:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2366,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "37684:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37683:12:0"
                  },
                  "returnParameters": {
                    "id": 2369,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37704:0:0"
                  },
                  "scope": 2972,
                  "src": "37663:97:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2450,
                    "nodeType": "Block",
                    "src": "37853:589:0",
                    "statements": [
                      {
                        "assignments": [
                          2390
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2390,
                            "mutability": "mutable",
                            "name": "reward",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2450,
                            "src": "37866:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2389,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "37866:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2394,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2392,
                              "name": "_account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2381,
                              "src": "37890:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 2391,
                            "name": "earned",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2089,
                            "src": "37883:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view returns (uint256)"
                            }
                          },
                          "id": 2393,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37883:16:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "37866:33:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2395,
                            "name": "reward",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2390,
                            "src": "37914:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2396,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "37923:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "37914:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2417,
                        "nodeType": "IfStatement",
                        "src": "37910:169:0",
                        "trueBody": {
                          "id": 2416,
                          "nodeType": "Block",
                          "src": "37926:153:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2402,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2398,
                                    "name": "rewards",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1717,
                                    "src": "37941:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2400,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2399,
                                    "name": "_account",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2381,
                                    "src": "37949:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "37941:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2401,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37961:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "37941:21:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2403,
                              "nodeType": "ExpressionStatement",
                              "src": "37941:21:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2407,
                                    "name": "_account",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2381,
                                    "src": "38002:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2408,
                                    "name": "reward",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2390,
                                    "src": "38012:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2404,
                                    "name": "rewardToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1665,
                                    "src": "37977:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20_$728",
                                      "typeString": "contract IERC20"
                                    }
                                  },
                                  "id": 2406,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1407,
                                  "src": "37977:24:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$728_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$728_$",
                                    "typeString": "function (contract IERC20,address,uint256)"
                                  }
                                },
                                "id": 2409,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "37977:42:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2410,
                              "nodeType": "ExpressionStatement",
                              "src": "37977:42:0"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2412,
                                    "name": "_account",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2381,
                                    "src": "38050:8:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2413,
                                    "name": "reward",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2390,
                                    "src": "38060:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2411,
                                  "name": "RewardPaid",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1742,
                                  "src": "38039:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint256)"
                                  }
                                },
                                "id": 2414,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38039:28:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2415,
                              "nodeType": "EmitStatement",
                              "src": "38034:33:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2418,
                          "name": "_claimExtras",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2383,
                          "src": "38142:12:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2446,
                        "nodeType": "IfStatement",
                        "src": "38139:203:0",
                        "trueBody": {
                          "id": 2445,
                          "nodeType": "Block",
                          "src": "38155:187:0",
                          "statements": [
                            {
                              "assignments": [
                                2420
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2420,
                                  "mutability": "mutable",
                                  "name": "length",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2445,
                                  "src": "38170:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2419,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "38170:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2423,
                              "initialValue": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2421,
                                  "name": "extraRewards",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1720,
                                  "src": "38187:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                    "typeString": "address[] storage ref"
                                  }
                                },
                                "id": 2422,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38187:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "38170:36:0"
                            },
                            {
                              "body": {
                                "id": 2443,
                                "nodeType": "Block",
                                "src": "38251:80:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2440,
                                          "name": "_account",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2381,
                                          "src": "38306:8:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 2435,
                                                "name": "extraRewards",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1720,
                                                "src": "38279:12:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                                  "typeString": "address[] storage ref"
                                                }
                                              },
                                              "id": 2437,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 2436,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2425,
                                                "src": "38292:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "38279:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 2434,
                                            "name": "IRewards",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 384,
                                            "src": "38270:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                              "typeString": "type(contract IRewards)"
                                            }
                                          },
                                          "id": 2438,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "38270:25:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRewards_$384",
                                            "typeString": "contract IRewards"
                                          }
                                        },
                                        "id": 2439,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "getReward",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 351,
                                        "src": "38270:35:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                                          "typeString": "function (address) external"
                                        }
                                      },
                                      "id": 2441,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "38270:45:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 2442,
                                    "nodeType": "ExpressionStatement",
                                    "src": "38270:45:0"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2430,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2428,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2425,
                                  "src": "38235:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2429,
                                  "name": "length",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2420,
                                  "src": "38239:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "38235:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2444,
                              "initializationExpression": {
                                "assignments": [
                                  2425
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2425,
                                    "mutability": "mutable",
                                    "name": "i",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2444,
                                    "src": "38225:6:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2424,
                                      "name": "uint",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "38225:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2427,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2426,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38232:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "38225:8:0"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2432,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "38247:3:0",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 2431,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2425,
                                    "src": "38247:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2433,
                                "nodeType": "ExpressionStatement",
                                "src": "38247:3:0"
                              },
                              "nodeType": "ForStatement",
                              "src": "38221:110:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2447,
                            "name": "checkHarvest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2481,
                            "src": "38420:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2448,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38420:14:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2449,
                        "nodeType": "ExpressionStatement",
                        "src": "38420:14:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "7050ccd9",
                  "id": 2451,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2386,
                          "name": "_account",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2381,
                          "src": "37844:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2387,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2385,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "37831:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "37831:22:0"
                    }
                  ],
                  "name": "getReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2384,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2381,
                        "mutability": "mutable",
                        "name": "_account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2451,
                        "src": "37787:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2380,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37787:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2383,
                        "mutability": "mutable",
                        "name": "_claimExtras",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2451,
                        "src": "37805:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2382,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "37805:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37786:37:0"
                  },
                  "returnParameters": {
                    "id": 2388,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37853:0:0"
                  },
                  "scope": 2972,
                  "src": "37768:674:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2460,
                    "nodeType": "Block",
                    "src": "38479:45:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2455,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "38500:3:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 2456,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "38500:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 2457,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "38511:4:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2454,
                            "name": "getReward",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2451,
                            "src": "38490:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,bool)"
                            }
                          },
                          "id": 2458,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38490:26:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2459,
                        "nodeType": "ExpressionStatement",
                        "src": "38490:26:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3d18b912",
                  "id": 2461,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2452,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38468:2:0"
                  },
                  "returnParameters": {
                    "id": 2453,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38479:0:0"
                  },
                  "scope": 2972,
                  "src": "38450:74:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 2480,
                    "nodeType": "Block",
                    "src": "38564:220:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 2474,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2466,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2464,
                              "name": "periodFinish",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1681,
                              "src": "38660:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2465,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "38675:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "38660:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2473,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 2467,
                                "name": "block",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -4,
                                "src": "38680:5:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_block",
                                  "typeString": "block"
                                }
                              },
                              "id": 2468,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "timestamp",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "38680:15:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 2471,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38716:6:0",
                                  "subdenomination": "days",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_86400_by_1",
                                    "typeString": "int_const 86400"
                                  },
                                  "value": "1"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_86400_by_1",
                                    "typeString": "int_const 86400"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2469,
                                  "name": "periodFinish",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1681,
                                  "src": "38699:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2470,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 931,
                                "src": "38699:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 2472,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38699:24:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "38680:43:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "38660:63:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2479,
                        "nodeType": "IfStatement",
                        "src": "38656:121:0",
                        "trueBody": {
                          "id": 2478,
                          "nodeType": "Block",
                          "src": "38727:50:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 2475,
                                  "name": "harvestFromMasterChef",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1865,
                                  "src": "38742:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                                    "typeString": "function ()"
                                  }
                                },
                                "id": 2476,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "38742:23:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2477,
                              "nodeType": "ExpressionStatement",
                              "src": "38742:23:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2481,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "checkHarvest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2462,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38553:2:0"
                  },
                  "returnParameters": {
                    "id": 2463,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38564:0:0"
                  },
                  "scope": 2972,
                  "src": "38532:252:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2564,
                    "nodeType": "Block",
                    "src": "39086:585:0",
                    "statements": [
                      {
                        "assignments": [
                          2491
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2491,
                            "mutability": "mutable",
                            "name": "reward",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2564,
                            "src": "39097:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2490,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "39097:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2499,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2496,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "39144:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 2495,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "39136:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2494,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "39136:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2497,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39136:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2492,
                              "name": "rewardToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1665,
                              "src": "39114:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$728",
                                "typeString": "contract IERC20"
                              }
                            },
                            "id": 2493,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 667,
                            "src": "39114:21:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 2498,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39114:36:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "39097:53:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2503,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2500,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "39167:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2501,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "39167:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2502,
                            "name": "periodFinish",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1681,
                            "src": "39186:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39167:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2541,
                          "nodeType": "Block",
                          "src": "39266:231:0",
                          "statements": [
                            {
                              "assignments": [
                                2513
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2513,
                                  "mutability": "mutable",
                                  "name": "remaining",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2541,
                                  "src": "39281:17:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2512,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "39281:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2519,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2516,
                                      "name": "block",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -4,
                                      "src": "39318:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_block",
                                        "typeString": "block"
                                      }
                                    },
                                    "id": 2517,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "timestamp",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "39318:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2514,
                                    "name": "periodFinish",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1681,
                                    "src": "39301:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2515,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 931,
                                  "src": "39301:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2518,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "39301:33:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "39281:53:0"
                            },
                            {
                              "assignments": [
                                2521
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2521,
                                  "mutability": "mutable",
                                  "name": "leftover",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2541,
                                  "src": "39349:16:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2520,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "39349:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2526,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2524,
                                    "name": "rewardRate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1684,
                                    "src": "39382:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2522,
                                    "name": "remaining",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2513,
                                    "src": "39368:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2523,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 965,
                                  "src": "39368:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2525,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "39368:25:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "39349:44:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2532,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2527,
                                  "name": "reward",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2491,
                                  "src": "39408:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2530,
                                      "name": "leftover",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2521,
                                      "src": "39428:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2528,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2491,
                                      "src": "39417:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2529,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 909,
                                    "src": "39417:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2531,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "39417:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "39408:29:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2533,
                              "nodeType": "ExpressionStatement",
                              "src": "39408:29:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2539,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2534,
                                  "name": "rewardRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1684,
                                  "src": "39452:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2537,
                                      "name": "duration",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1670,
                                      "src": "39476:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2535,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2491,
                                      "src": "39465:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2536,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "div",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 987,
                                    "src": "39465:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2538,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "39465:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "39452:33:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2540,
                              "nodeType": "ExpressionStatement",
                              "src": "39452:33:0"
                            }
                          ]
                        },
                        "id": 2542,
                        "nodeType": "IfStatement",
                        "src": "39163:334:0",
                        "trueBody": {
                          "id": 2511,
                          "nodeType": "Block",
                          "src": "39200:60:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2509,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2504,
                                  "name": "rewardRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1684,
                                  "src": "39215:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2507,
                                      "name": "duration",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1670,
                                      "src": "39239:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2505,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2491,
                                      "src": "39228:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2506,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "div",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 987,
                                    "src": "39228:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2508,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "39228:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "39215:33:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2510,
                              "nodeType": "ExpressionStatement",
                              "src": "39215:33:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2543,
                            "name": "currentRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1691,
                            "src": "39507:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2544,
                            "name": "reward",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2491,
                            "src": "39524:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39507:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2546,
                        "nodeType": "ExpressionStatement",
                        "src": "39507:23:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2550,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2547,
                            "name": "lastUpdateTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1686,
                            "src": "39541:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2548,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "39558:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2549,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "39558:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39541:32:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2551,
                        "nodeType": "ExpressionStatement",
                        "src": "39541:32:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2558,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2552,
                            "name": "periodFinish",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1681,
                            "src": "39584:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2556,
                                "name": "duration",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1670,
                                "src": "39619:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2553,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "39599:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 2554,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "timestamp",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39599:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2555,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "39599:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2557,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "39599:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "39584:44:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2559,
                        "nodeType": "ExpressionStatement",
                        "src": "39584:44:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2561,
                              "name": "reward",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2491,
                              "src": "39656:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2560,
                            "name": "RewardAdded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1724,
                            "src": "39644:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 2562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39644:19:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2563,
                        "nodeType": "EmitStatement",
                        "src": "39639:24:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2565,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2486,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "39083:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 2485,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "39075:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2484,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "39075:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2487,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39075:10:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "id": 2488,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2483,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "39062:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "39062:24:0"
                    }
                  ],
                  "name": "initRewards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2482,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39050:2:0"
                  },
                  "returnParameters": {
                    "id": 2489,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39086:0:0"
                  },
                  "scope": 2972,
                  "src": "39030:641:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2672,
                    "nodeType": "Block",
                    "src": "39758:1102:0",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 2575,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "39772:7:0",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 2574,
                            "name": "isInit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1701,
                            "src": "39773:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2578,
                        "nodeType": "IfStatement",
                        "src": "39769:157:0",
                        "trueBody": {
                          "id": 2577,
                          "nodeType": "Block",
                          "src": "39780:146:0",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 2573,
                              "id": 2576,
                              "nodeType": "Return",
                              "src": "39908:7:0"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          null,
                          2580
                        ],
                        "declarations": [
                          null,
                          {
                            "constant": false,
                            "id": 2580,
                            "mutability": "mutable",
                            "name": "rewardDebt",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2672,
                            "src": "40118:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2579,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40118:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2591,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2585,
                              "name": "chefPid",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1678,
                              "src": "40179:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2588,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "40196:4:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ConvexRewarder_$2972",
                                    "typeString": "contract ConvexRewarder"
                                  }
                                ],
                                "id": 2587,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "40188:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2586,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "40188:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2589,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40188:13:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2582,
                                  "name": "convexMasterChef",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1676,
                                  "src": "40152:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 2581,
                                "name": "IConvexChef",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1655,
                                "src": "40140:11:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IConvexChef_$1655_$",
                                  "typeString": "type(contract IConvexChef)"
                                }
                              },
                              "id": 2583,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40140:29:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IConvexChef_$1655",
                                "typeString": "contract IConvexChef"
                              }
                            },
                            "id": 2584,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "userInfo",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1640,
                            "src": "40140:38:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_uint256_$_t_address_$returns$_t_uint256_$_t_uint256_$",
                              "typeString": "function (uint256,address) view external returns (uint256,uint256)"
                            }
                          },
                          "id": 2590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40140:62:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                            "typeString": "tuple(uint256,uint256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40116:86:0"
                      },
                      {
                        "assignments": [
                          2593
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2593,
                            "mutability": "mutable",
                            "name": "reward",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2672,
                            "src": "40213:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2592,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "40213:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2598,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2596,
                              "name": "previousRewardDebt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1698,
                              "src": "40245:18:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2594,
                              "name": "rewardDebt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2580,
                              "src": "40230:10:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2595,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 931,
                            "src": "40230:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2597,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40230:34:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "40213:51:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2601,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2599,
                            "name": "previousRewardDebt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1698,
                            "src": "40275:18:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2600,
                            "name": "rewardDebt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2580,
                            "src": "40296:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40275:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2602,
                        "nodeType": "ExpressionStatement",
                        "src": "40275:31:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2605,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2603,
                            "name": "reward",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2593,
                            "src": "40320:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2604,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "40330:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "40320:11:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2607,
                        "nodeType": "IfStatement",
                        "src": "40317:23:0",
                        "trueBody": {
                          "expression": null,
                          "functionReturnParameters": 2573,
                          "id": 2606,
                          "nodeType": "Return",
                          "src": "40333:7:0"
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2611,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2608,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "40356:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2609,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "40356:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2610,
                            "name": "periodFinish",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1681,
                            "src": "40375:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40356:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2649,
                          "nodeType": "Block",
                          "src": "40455:231:0",
                          "statements": [
                            {
                              "assignments": [
                                2621
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2621,
                                  "mutability": "mutable",
                                  "name": "remaining",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2649,
                                  "src": "40470:17:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2620,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40470:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2627,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2624,
                                      "name": "block",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -4,
                                      "src": "40507:5:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_block",
                                        "typeString": "block"
                                      }
                                    },
                                    "id": 2625,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "timestamp",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "40507:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2622,
                                    "name": "periodFinish",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1681,
                                    "src": "40490:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2623,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 931,
                                  "src": "40490:16:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2626,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "40490:33:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "40470:53:0"
                            },
                            {
                              "assignments": [
                                2629
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2629,
                                  "mutability": "mutable",
                                  "name": "leftover",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2649,
                                  "src": "40538:16:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2628,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "40538:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2634,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2632,
                                    "name": "rewardRate",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1684,
                                    "src": "40571:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2630,
                                    "name": "remaining",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2621,
                                    "src": "40557:9:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2631,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 965,
                                  "src": "40557:13:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2633,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "40557:25:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "40538:44:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2640,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2635,
                                  "name": "reward",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2593,
                                  "src": "40597:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2638,
                                      "name": "leftover",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2629,
                                      "src": "40617:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2636,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2593,
                                      "src": "40606:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2637,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 909,
                                    "src": "40606:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2639,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "40606:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40597:29:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2641,
                              "nodeType": "ExpressionStatement",
                              "src": "40597:29:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2647,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2642,
                                  "name": "rewardRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1684,
                                  "src": "40641:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2645,
                                      "name": "duration",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1670,
                                      "src": "40665:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2643,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2593,
                                      "src": "40654:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2644,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "div",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 987,
                                    "src": "40654:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2646,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "40654:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40641:33:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2648,
                              "nodeType": "ExpressionStatement",
                              "src": "40641:33:0"
                            }
                          ]
                        },
                        "id": 2650,
                        "nodeType": "IfStatement",
                        "src": "40352:334:0",
                        "trueBody": {
                          "id": 2619,
                          "nodeType": "Block",
                          "src": "40389:60:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2617,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2612,
                                  "name": "rewardRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1684,
                                  "src": "40404:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2615,
                                      "name": "duration",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1670,
                                      "src": "40428:8:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2613,
                                      "name": "reward",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2593,
                                      "src": "40417:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2614,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "div",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 987,
                                    "src": "40417:10:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2616,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "40417:20:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "40404:33:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2618,
                              "nodeType": "ExpressionStatement",
                              "src": "40404:33:0"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2653,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2651,
                            "name": "currentRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1691,
                            "src": "40696:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2652,
                            "name": "reward",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2593,
                            "src": "40713:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40696:23:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2654,
                        "nodeType": "ExpressionStatement",
                        "src": "40696:23:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2658,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2655,
                            "name": "lastUpdateTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1686,
                            "src": "40730:14:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2656,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "40747:5:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 2657,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "40747:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40730:32:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2659,
                        "nodeType": "ExpressionStatement",
                        "src": "40730:32:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2666,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2660,
                            "name": "periodFinish",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1681,
                            "src": "40773:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2664,
                                "name": "duration",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1670,
                                "src": "40808:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2661,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "40788:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 2662,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "timestamp",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40788:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2663,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 909,
                              "src": "40788:19:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2665,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "40788:29:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "40773:44:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2667,
                        "nodeType": "ExpressionStatement",
                        "src": "40773:44:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2669,
                              "name": "reward",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2593,
                              "src": "40845:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2668,
                            "name": "RewardAdded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1724,
                            "src": "40833:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 2670,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40833:19:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2671,
                        "nodeType": "EmitStatement",
                        "src": "40828:24:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2673,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2570,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "39749:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 2569,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "39741:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2568,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "39741:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2571,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39741:10:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "id": 2572,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2567,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "39728:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "39728:24:0"
                    }
                  ],
                  "name": "notifyRewardAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2566,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39706:2:0"
                  },
                  "returnParameters": {
                    "id": 2573,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39758:0:0"
                  },
                  "scope": 2972,
                  "src": "39679:1181:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    1603
                  ],
                  "body": {
                    "id": 2850,
                    "nodeType": "Block",
                    "src": "41090:2027:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2694,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2691,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "41109:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 2692,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41109:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2693,
                                "name": "tattooMasterChef",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1674,
                                "src": "41123:16:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "41109:30:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2690,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "41101:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                              "typeString": "function (bool) pure"
                            }
                          },
                          "id": 2695,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41101:39:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2696,
                        "nodeType": "ExpressionStatement",
                        "src": "41101:39:0"
                      },
                      {
                        "assignments": [
                          2698
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2698,
                            "mutability": "mutable",
                            "name": "_tattooPid",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2850,
                            "src": "41530:18:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2697,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "41530:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2700,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 2699,
                          "name": "tattooPid",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1695,
                          "src": "41551:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "41530:30:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2703,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2701,
                            "name": "_tattooPid",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2698,
                            "src": "41575:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2702,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "41589:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "41575:15:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 2727,
                          "nodeType": "Block",
                          "src": "41718:53:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2724,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 2722,
                                      "name": "pid",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2675,
                                      "src": "41741:3:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 2723,
                                      "name": "_tattooPid",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2698,
                                      "src": "41748:10:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "41741:17:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 2721,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "41733:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                                    "typeString": "function (bool) pure"
                                  }
                                },
                                "id": 2725,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41733:26:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2726,
                              "nodeType": "ExpressionStatement",
                              "src": "41733:26:0"
                            }
                          ]
                        },
                        "id": 2728,
                        "nodeType": "IfStatement",
                        "src": "41571:200:0",
                        "trueBody": {
                          "id": 2720,
                          "nodeType": "Block",
                          "src": "41592:120:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_contract$_IERC20_$728",
                                      "typeString": "contract IERC20"
                                    },
                                    "id": 2713,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2710,
                                          "name": "pid",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2675,
                                          "src": "41649:3:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 2706,
                                                "name": "msg",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": -15,
                                                "src": "41629:3:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_magic_message",
                                                  "typeString": "msg"
                                                }
                                              },
                                              "id": 2707,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "sender",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "41629:10:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address_payable",
                                                "typeString": "address payable"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address_payable",
                                                "typeString": "address payable"
                                              }
                                            ],
                                            "id": 2705,
                                            "name": "IMasterChefV2",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1629,
                                            "src": "41615:13:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IMasterChefV2_$1629_$",
                                              "typeString": "type(contract IMasterChefV2)"
                                            }
                                          },
                                          "id": 2708,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "41615:25:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IMasterChefV2_$1629",
                                            "typeString": "contract IMasterChefV2"
                                          }
                                        },
                                        "id": 2709,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "lpToken",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1628,
                                        "src": "41615:33:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_contract$_IERC20_$728_$",
                                          "typeString": "function (uint256) view external returns (contract IERC20)"
                                        }
                                      },
                                      "id": 2711,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "41615:38:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 2712,
                                      "name": "stakingToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1667,
                                      "src": "41657:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20_$728",
                                        "typeString": "contract IERC20"
                                      }
                                    },
                                    "src": "41615:54:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 2704,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "41607:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$returns$__$",
                                    "typeString": "function (bool) pure"
                                  }
                                },
                                "id": 2714,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "41607:63:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2715,
                              "nodeType": "ExpressionStatement",
                              "src": "41607:63:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2718,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2716,
                                  "name": "tattooPid",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1695,
                                  "src": "41685:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2717,
                                  "name": "pid",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2675,
                                  "src": "41697:3:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "41685:15:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2719,
                              "nodeType": "ExpressionStatement",
                              "src": "41685:15:0"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2729,
                            "name": "tattooAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2681,
                            "src": "41787:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2730,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "41802:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "41787:16:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2738,
                        "nodeType": "IfStatement",
                        "src": "41783:310:0",
                        "trueBody": {
                          "id": 2737,
                          "nodeType": "Block",
                          "src": "41805:288:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2733,
                                    "name": "user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2677,
                                    "src": "42071:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "74727565",
                                    "id": 2734,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "bool",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "42076:4:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "value": "true"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "id": 2732,
                                  "name": "getReward",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2451,
                                  "src": "42061:9:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bool_$returns$__$",
                                    "typeString": "function (address,bool)"
                                  }
                                },
                                "id": 2735,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42061:20:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2736,
                              "nodeType": "ExpressionStatement",
                              "src": "42061:20:0"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          2740
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2740,
                            "mutability": "mutable",
                            "name": "userBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2850,
                            "src": "42105:19:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2739,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "42105:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2744,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2741,
                            "name": "_tattooBalances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1709,
                            "src": "42127:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 2743,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2742,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2677,
                            "src": "42143:4:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "42127:21:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "42105:43:0"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2745,
                            "name": "newLpAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2683,
                            "src": "42163:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2746,
                            "name": "userBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2740,
                            "src": "42177:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "42163:25:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 2798,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 2796,
                              "name": "newLpAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2683,
                              "src": "42638:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 2797,
                              "name": "userBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2740,
                              "src": "42652:11:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "42638:25:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 2848,
                          "nodeType": "IfStatement",
                          "src": "42634:476:0",
                          "trueBody": {
                            "id": 2847,
                            "nodeType": "Block",
                            "src": "42665:445:0",
                            "statements": [
                              {
                                "assignments": [
                                  2800
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2800,
                                    "mutability": "mutable",
                                    "name": "amount",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2847,
                                    "src": "42765:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2799,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "42765:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2805,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2803,
                                      "name": "newLpAmount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2683,
                                      "src": "42798:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2801,
                                      "name": "userBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2740,
                                      "src": "42782:11:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2802,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 931,
                                    "src": "42782:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2804,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "42782:28:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "42765:45:0"
                              },
                              {
                                "assignments": [
                                  2807
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2807,
                                    "mutability": "mutable",
                                    "name": "length",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2847,
                                    "src": "42825:14:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2806,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "42825:7:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2810,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2808,
                                    "name": "extraRewards",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1720,
                                    "src": "42842:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                      "typeString": "address[] storage ref"
                                    }
                                  },
                                  "id": 2809,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "42842:19:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "42825:36:0"
                              },
                              {
                                "body": {
                                  "id": 2832,
                                  "nodeType": "Block",
                                  "src": "42906:89:0",
                                  "statements": [
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 2827,
                                              "name": "msg",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -15,
                                              "src": "42960:3:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_message",
                                                "typeString": "msg"
                                              }
                                            },
                                            "id": 2828,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sender",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "42960:10:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 2829,
                                            "name": "amount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2800,
                                            "src": "42972:6:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "baseExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2822,
                                                  "name": "extraRewards",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 1720,
                                                  "src": "42934:12:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                                    "typeString": "address[] storage ref"
                                                  }
                                                },
                                                "id": 2824,
                                                "indexExpression": {
                                                  "argumentTypes": null,
                                                  "id": 2823,
                                                  "name": "i",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 2812,
                                                  "src": "42947:1:0",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "nodeType": "IndexAccess",
                                                "src": "42934:15:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              ],
                                              "id": 2821,
                                              "name": "IRewards",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 384,
                                              "src": "42925:8:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                                "typeString": "type(contract IRewards)"
                                              }
                                            },
                                            "id": 2825,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "42925:25:0",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IRewards_$384",
                                              "typeString": "contract IRewards"
                                            }
                                          },
                                          "id": 2826,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "withdraw",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 341,
                                          "src": "42925:34:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                            "typeString": "function (address,uint256) external"
                                          }
                                        },
                                        "id": 2830,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "42925:54:0",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$__$",
                                          "typeString": "tuple()"
                                        }
                                      },
                                      "id": 2831,
                                      "nodeType": "ExpressionStatement",
                                      "src": "42925:54:0"
                                    }
                                  ]
                                },
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 2817,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2815,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2812,
                                    "src": "42890:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "<",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2816,
                                    "name": "length",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2807,
                                    "src": "42894:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "42890:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "id": 2833,
                                "initializationExpression": {
                                  "assignments": [
                                    2812
                                  ],
                                  "declarations": [
                                    {
                                      "constant": false,
                                      "id": 2812,
                                      "mutability": "mutable",
                                      "name": "i",
                                      "nodeType": "VariableDeclaration",
                                      "overrides": null,
                                      "scope": 2833,
                                      "src": "42880:6:0",
                                      "stateVariable": false,
                                      "storageLocation": "default",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "typeName": {
                                        "id": 2811,
                                        "name": "uint",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "42880:4:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "value": null,
                                      "visibility": "internal"
                                    }
                                  ],
                                  "id": 2814,
                                  "initialValue": {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2813,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "42887:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  },
                                  "nodeType": "VariableDeclarationStatement",
                                  "src": "42880:8:0"
                                },
                                "loopExpression": {
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2819,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "++",
                                    "prefix": false,
                                    "src": "42902:3:0",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "id": 2818,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2812,
                                      "src": "42902:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2820,
                                  "nodeType": "ExpressionStatement",
                                  "src": "42902:3:0"
                                },
                                "nodeType": "ForStatement",
                                "src": "42876:119:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2839,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "id": 2834,
                                    "name": "_totalSupply",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1693,
                                    "src": "43009:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2837,
                                        "name": "amount",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2800,
                                        "src": "43041:6:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2835,
                                        "name": "_totalSupply",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1693,
                                        "src": "43024:12:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2836,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 931,
                                      "src": "43024:16:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2838,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "43024:24:0",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "43009:39:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2840,
                                "nodeType": "ExpressionStatement",
                                "src": "43009:39:0"
                              },
                              {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2845,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftHandSide": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 2841,
                                      "name": "_tattooBalances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1709,
                                      "src": "43063:15:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                        "typeString": "mapping(address => uint256)"
                                      }
                                    },
                                    "id": 2843,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 2842,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2677,
                                      "src": "43079:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": true,
                                    "nodeType": "IndexAccess",
                                    "src": "43063:21:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "Assignment",
                                  "operator": "=",
                                  "rightHandSide": {
                                    "argumentTypes": null,
                                    "id": 2844,
                                    "name": "newLpAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2683,
                                    "src": "43087:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "43063:35:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2846,
                                "nodeType": "ExpressionStatement",
                                "src": "43063:35:0"
                              }
                            ]
                          }
                        },
                        "id": 2849,
                        "nodeType": "IfStatement",
                        "src": "42159:951:0",
                        "trueBody": {
                          "id": 2795,
                          "nodeType": "Block",
                          "src": "42190:438:0",
                          "statements": [
                            {
                              "assignments": [
                                2749
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2749,
                                  "mutability": "mutable",
                                  "name": "amount",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2795,
                                  "src": "42290:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2748,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "42290:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2754,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2752,
                                    "name": "userBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2740,
                                    "src": "42323:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2750,
                                    "name": "newLpAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2683,
                                    "src": "42307:11:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2751,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 931,
                                  "src": "42307:15:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2753,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "42307:28:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "42290:45:0"
                            },
                            {
                              "assignments": [
                                2756
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 2756,
                                  "mutability": "mutable",
                                  "name": "length",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 2795,
                                  "src": "42350:14:0",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 2755,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "42350:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 2759,
                              "initialValue": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2757,
                                  "name": "extraRewards",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1720,
                                  "src": "42367:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                    "typeString": "address[] storage ref"
                                  }
                                },
                                "id": 2758,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42367:19:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "42350:36:0"
                            },
                            {
                              "body": {
                                "id": 2780,
                                "nodeType": "Block",
                                "src": "42431:80:0",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 2776,
                                          "name": "user",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2677,
                                          "src": "42482:4:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 2777,
                                          "name": "amount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2749,
                                          "src": "42488:6:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 2771,
                                                "name": "extraRewards",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1720,
                                                "src": "42459:12:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                                  "typeString": "address[] storage ref"
                                                }
                                              },
                                              "id": 2773,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 2772,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2761,
                                                "src": "42472:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "42459:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 2770,
                                            "name": "IRewards",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 384,
                                            "src": "42450:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                              "typeString": "type(contract IRewards)"
                                            }
                                          },
                                          "id": 2774,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "42450:25:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRewards_$384",
                                            "typeString": "contract IRewards"
                                          }
                                        },
                                        "id": 2775,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "stake",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 327,
                                        "src": "42450:31:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,uint256) external"
                                        }
                                      },
                                      "id": 2778,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "42450:45:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 2779,
                                    "nodeType": "ExpressionStatement",
                                    "src": "42450:45:0"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 2766,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 2764,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2761,
                                  "src": "42415:1:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2765,
                                  "name": "length",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2756,
                                  "src": "42419:6:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "42415:10:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 2781,
                              "initializationExpression": {
                                "assignments": [
                                  2761
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 2761,
                                    "mutability": "mutable",
                                    "name": "i",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 2781,
                                    "src": "42405:6:0",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 2760,
                                      "name": "uint",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "42405:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 2763,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2762,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42412:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "42405:8:0"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2768,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "42427:3:0",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 2767,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2761,
                                    "src": "42427:1:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 2769,
                                "nodeType": "ExpressionStatement",
                                "src": "42427:3:0"
                              },
                              "nodeType": "ForStatement",
                              "src": "42401:110:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2787,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 2782,
                                  "name": "_totalSupply",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1693,
                                  "src": "42525:12:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2785,
                                      "name": "amount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2749,
                                      "src": "42557:6:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2783,
                                      "name": "_totalSupply",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1693,
                                      "src": "42540:12:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2784,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 909,
                                    "src": "42540:16:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 2786,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "42540:24:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "42525:39:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2788,
                              "nodeType": "ExpressionStatement",
                              "src": "42525:39:0"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2793,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2789,
                                    "name": "_tattooBalances",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1709,
                                    "src": "42579:15:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 2791,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2790,
                                    "name": "user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2677,
                                    "src": "42595:4:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "42579:21:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 2792,
                                  "name": "newLpAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2683,
                                  "src": "42603:11:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "42579:35:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2794,
                              "nodeType": "ExpressionStatement",
                              "src": "42579:35:0"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "e24c7613",
                  "id": 2851,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2687,
                          "name": "user",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2677,
                          "src": "41079:4:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 2688,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2686,
                        "name": "updateReward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2006,
                        "src": "41066:12:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "41066:18:0"
                    }
                  ],
                  "name": "onTattooReward",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2685,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "41038:8:0"
                  },
                  "parameters": {
                    "id": 2684,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2675,
                        "mutability": "mutable",
                        "name": "pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2851,
                        "src": "40902:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2674,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "40902:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2677,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2851,
                        "src": "40924:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2676,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "40924:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2679,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2851,
                        "src": "40947:17:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2678,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "40947:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2681,
                        "mutability": "mutable",
                        "name": "tattooAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2851,
                        "src": "40975:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2680,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "40975:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2683,
                        "mutability": "mutable",
                        "name": "newLpAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2851,
                        "src": "41006:19:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2682,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "41006:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40891:141:0"
                  },
                  "returnParameters": {
                    "id": 2689,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41090:0:0"
                  },
                  "scope": 2972,
                  "src": "40868:2249:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    1618
                  ],
                  "body": {
                    "id": 2970,
                    "nodeType": "Block",
                    "src": "43323:643:0",
                    "statements": [
                      {
                        "assignments": [
                          2868
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2868,
                            "mutability": "mutable",
                            "name": "length",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2970,
                            "src": "43366:14:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2867,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "43366:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2871,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2869,
                            "name": "extraRewards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1720,
                            "src": "43383:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                              "typeString": "address[] storage ref"
                            }
                          },
                          "id": 2870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "43383:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43366:36:0"
                      },
                      {
                        "assignments": [
                          2875
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2875,
                            "mutability": "mutable",
                            "name": "rewardTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2970,
                            "src": "43450:28:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                              "typeString": "contract IERC20[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 2873,
                                "name": "IERC20",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 728,
                                "src": "43450:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$728",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 2874,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43450:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_storage_ptr",
                                "typeString": "contract IERC20[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2883,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2881,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 2879,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "43494:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2880,
                                "name": "length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2868,
                                "src": "43496:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "43494:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2878,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "43481:12:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (contract IERC20[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 2876,
                                "name": "IERC20",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 728,
                                "src": "43485:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$728",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 2877,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43485:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_storage_ptr",
                                "typeString": "contract IERC20[]"
                              }
                            }
                          },
                          "id": 2882,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43481:22:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                            "typeString": "contract IERC20[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43450:53:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2888,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2884,
                              "name": "rewardTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2875,
                              "src": "43514:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                                "typeString": "contract IERC20[] memory"
                              }
                            },
                            "id": 2886,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2885,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "43527:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "43514:15:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2887,
                            "name": "rewardToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1665,
                            "src": "43532:11:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "src": "43514:29:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$728",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 2889,
                        "nodeType": "ExpressionStatement",
                        "src": "43514:29:0"
                      },
                      {
                        "body": {
                          "id": 2916,
                          "nodeType": "Block",
                          "src": "43584:94:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2914,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2900,
                                    "name": "rewardTokens",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2875,
                                    "src": "43599:12:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                                      "typeString": "contract IERC20[] memory"
                                    }
                                  },
                                  "id": 2904,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2903,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 2901,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "43612:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "+",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 2902,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2891,
                                      "src": "43614:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "43612:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "43599:17:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 2907,
                                                "name": "extraRewards",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 1720,
                                                "src": "43635:12:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                                  "typeString": "address[] storage ref"
                                                }
                                              },
                                              "id": 2909,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 2908,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 2891,
                                                "src": "43648:1:0",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "43635:15:0",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 2906,
                                            "name": "IRewards",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 384,
                                            "src": "43626:8:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                              "typeString": "type(contract IRewards)"
                                            }
                                          },
                                          "id": 2910,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "43626:25:0",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IRewards_$384",
                                            "typeString": "contract IRewards"
                                          }
                                        },
                                        "id": 2911,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "rewardToken",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 376,
                                        "src": "43626:37:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                          "typeString": "function () view external returns (address)"
                                        }
                                      },
                                      "id": 2912,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "43626:39:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 2905,
                                    "name": "IERC20",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 728,
                                    "src": "43619:6:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20_$728_$",
                                      "typeString": "type(contract IERC20)"
                                    }
                                  },
                                  "id": 2913,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "43619:47:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20_$728",
                                    "typeString": "contract IERC20"
                                  }
                                },
                                "src": "43599:67:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$728",
                                  "typeString": "contract IERC20"
                                }
                              },
                              "id": 2915,
                              "nodeType": "ExpressionStatement",
                              "src": "43599:67:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2896,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2894,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2891,
                            "src": "43568:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2895,
                            "name": "length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2868,
                            "src": "43572:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43568:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2917,
                        "initializationExpression": {
                          "assignments": [
                            2891
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2891,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2917,
                              "src": "43558:6:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2890,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "43558:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2893,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2892,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "43565:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "43558:8:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2898,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "43580:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2897,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2891,
                              "src": "43580:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2899,
                          "nodeType": "ExpressionStatement",
                          "src": "43580:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "43554:124:0"
                      },
                      {
                        "assignments": [
                          2922
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2922,
                            "mutability": "mutable",
                            "name": "earnedAmounts",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2970,
                            "src": "43688:30:0",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2920,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43688:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2921,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43688:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2930,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 2928,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 2926,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "43735:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "+",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2927,
                                "name": "length",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2868,
                                "src": "43737:6:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "43735:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2925,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "43721:13:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (uint256[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 2923,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "43725:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2924,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "43725:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                "typeString": "uint256[]"
                              }
                            }
                          },
                          "id": 2929,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43721:23:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                            "typeString": "uint256[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "43688:56:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2937,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2931,
                              "name": "earnedAmounts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2922,
                              "src": "43755:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              }
                            },
                            "id": 2933,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2932,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "43769:1:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "43755:16:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2935,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2855,
                                "src": "43781:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 2934,
                              "name": "earned",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2089,
                              "src": "43774:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) view returns (uint256)"
                              }
                            },
                            "id": 2936,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "43774:12:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43755:31:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2938,
                        "nodeType": "ExpressionStatement",
                        "src": "43755:31:0"
                      },
                      {
                        "body": {
                          "id": 2964,
                          "nodeType": "Block",
                          "src": "43827:86:0",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2962,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2949,
                                    "name": "earnedAmounts",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2922,
                                    "src": "43842:13:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                      "typeString": "uint256[] memory"
                                    }
                                  },
                                  "id": 2953,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2952,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 2950,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "43856:1:0",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "+",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 2951,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2940,
                                      "src": "43858:1:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "43856:3:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "43842:18:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2960,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2855,
                                      "src": "43896:4:0",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 2955,
                                            "name": "extraRewards",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1720,
                                            "src": "43872:12:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_array$_t_address_$dyn_storage",
                                              "typeString": "address[] storage ref"
                                            }
                                          },
                                          "id": 2957,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 2956,
                                            "name": "i",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 2940,
                                            "src": "43885:1:0",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "43872:15:0",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 2954,
                                        "name": "IRewards",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 384,
                                        "src": "43863:8:0",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_contract$_IRewards_$384_$",
                                          "typeString": "type(contract IRewards)"
                                        }
                                      },
                                      "id": 2958,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "43863:25:0",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IRewards_$384",
                                        "typeString": "contract IRewards"
                                      }
                                    },
                                    "id": 2959,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "earned",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 383,
                                    "src": "43863:32:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                      "typeString": "function (address) view external returns (uint256)"
                                    }
                                  },
                                  "id": 2961,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "43863:38:0",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "43842:59:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2963,
                              "nodeType": "ExpressionStatement",
                              "src": "43842:59:0"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2945,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 2943,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2940,
                            "src": "43811:1:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 2944,
                            "name": "length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2868,
                            "src": "43815:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "43811:10:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2965,
                        "initializationExpression": {
                          "assignments": [
                            2940
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 2940,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 2965,
                              "src": "43801:6:0",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 2939,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "43801:4:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 2942,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2941,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "43808:1:0",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "43801:8:0"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2947,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "43823:3:0",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 2946,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2940,
                              "src": "43823:1:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2948,
                          "nodeType": "ExpressionStatement",
                          "src": "43823:3:0"
                        },
                        "nodeType": "ForStatement",
                        "src": "43797:116:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 2966,
                              "name": "rewardTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2875,
                              "src": "43931:12:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                                "typeString": "contract IERC20[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2967,
                              "name": "earnedAmounts",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2922,
                              "src": "43944:13:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                "typeString": "uint256[] memory"
                              }
                            }
                          ],
                          "id": 2968,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "43930:28:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$",
                            "typeString": "tuple(contract IERC20[] memory,uint256[] memory)"
                          }
                        },
                        "functionReturnParameters": 2866,
                        "id": 2969,
                        "nodeType": "Return",
                        "src": "43923:35:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "d63b3c49",
                  "id": 2971,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "pendingTokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2859,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "43236:8:0"
                  },
                  "parameters": {
                    "id": 2858,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2853,
                        "mutability": "mutable",
                        "name": "pid",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2971,
                        "src": "43158:11:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2852,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "43158:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2855,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2971,
                        "src": "43180:12:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2854,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "43180:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2857,
                        "mutability": "mutable",
                        "name": "tattooAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2971,
                        "src": "43203:20:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2856,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "43203:7:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43147:83:0"
                  },
                  "returnParameters": {
                    "id": 2866,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2862,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2971,
                        "src": "43283:15:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_memory_ptr",
                          "typeString": "contract IERC20[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 2860,
                            "name": "IERC20",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 728,
                            "src": "43283:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$728",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 2861,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43283:8:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20_$728_$dyn_storage_ptr",
                            "typeString": "contract IERC20[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2865,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2971,
                        "src": "43300:16:0",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 2863,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "43300:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 2864,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "43300:9:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43282:35:0"
                  },
                  "scope": 2972,
                  "src": "43125:841:0",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 2973,
              "src": "30571:13398:0"
            }
          ],
          "src": "33:43936:0"
        },
        "id": 0
      }
    }
  }
}
